Добрый день,
Пытаюсь написать не сложный код на Б4+ (12.01 SP41) АРМ Гл. Бухгалтер
Программка просматривает записи в MDOC.dbf и сравнивает сумму по документу с проводкой ДТ621-КТ901 и если сумма не совпадает то корректируется Main.dbf в соответствии с документом. Дело в том что у нас иногда бывают расхождения между суммой по документу и соответствующей проводкой на 1-2 копейки.
Вот код:
Код
unction My_Calc
PRIVATE S621 , Shifr, Date_B, Date_E, I, I2, SA, UC
ALTD()
IIF(_USER_CODE<>Nil,UC:=_USER_CODE, UC:=" 5")
S621 = LEFT("621 ",10)
I = 0
I2 = 0
Date_B:=DIALOG("Дата начала:",,DATE())
Date_E:=DIALOG("Дата окончания:",,DATE_B)
DBPUSH()
//
MAIN->(OrdSetFocus("TAG_NNOPER"))
Netuse("DOCS",LoadPath() + "SCLAD\Mdoc.dbf")
DOCS->(ORDSetFocus("MDoc_D"))
DOCS->(SetScope("UPPER(Sclad+Vid+Type+DTOS(Date))",UPPER("00000221"+DTOS(Date_B)),UPPER("00000221"+DTOS(Date_E)) ))
DOCS->(DBGOTOP())
DOCS->(F_SETRELATION("MAIN","PRO"))
DO WHILE DOCS->(!EOF())
I = I + 1
IIF (DOCS->L_NDS, SA:= DOCS->SUMOUT, SA:= DOCS->SUMOUT + DOCS->SUM_NDS)
// Select MAIN
MAIN->(DBGOTOP())
DO WHILE MAIN->(!EOF())
IF MAIN->DT_SCHET = S621
IF MAIN->SUMMA <> SA
// SayAndWait (STR(SA) + "---" + STR(MAIN->SUMMA))
MAIN->(RECLOCK())
MAIN->SUMMA := SA
MAIN->(F_DBUNLOCK())
EXIT
ENDIF
ENDIF
MAIN->(DBSKIP())
ENDDO
DOCS->(DBSKIP())
ENDDO
DOCS->(dbCLOSEAREA())
DBPOP()
Return
Объясните пожалуйста как рботает F_Setrelation()?
я наивно полагал что
Код
MAIN->(DBGOTOP())
DO WHILE MAIN->(!EOF())
IF MAIN->DT_SCHET = S621
IF MAIN->SUMMA <> SA
// SayAndWait (STR(SA) + "---" + STR(MAIN->SUMMA))
MAIN->(RECLOCK())
MAIN->SUMMA := SA
MAIN->(F_DBUNLOCK())
EXIT
ENDIF
ENDIF
MAIN->(DBSKIP())
ENDDO
должен перебирать все записи MAIN поле NNOPER которых равно полю PRO из MDOC но не получается т. е. не зависит, если убрать строчку
Код
MAIN->(DBGOTOP())
то MAIN и вправду встает на запись у которой NNOPER = PRO
но потом перемещается по МAIN без учета
Отношение (relations) пересчитывается при изменении номера записи в родительской базе ('docs'). При этом указатель в дочерней базе ('main') устанавливается на запись, соответствующую выражению связи. Единовременно. При этом никаких дополнительных ограничений на передвижение указателя по дочерней (main) базе не вводится. Сделали dbgotop() - получили указатель на первой записи.
В вашем случает надо изменить условие цикла, выкинуть dbgotop() и перебирать записи, пока docs->pro=main->nnoper, поскольку при установленной связи указатель автоматически переместится на первую запись в main, с сответствующим значением nnoper.
Второй вариант - установка setscope на main и обработка всех записей main, попавших в скоп.
Спасибо большое за оперативность.
Можно тогда еще , обязательно ли для Main в данном случае использовать индекс TAG_NNOPER или можно использовать другой индекс и скоп?
спасибо, я так и думал,а можно не втему. Есть функция
DIALOG(<текст запроса>,<формат ввода>,<значение по умолчанию>) можно ли с ее помощью пароль вводить, т.е. есть ли такой формат чтобы звездочками заменял?
Здравствуйте, Алексей.
Попробовал использовать GETSECRET()
что-то не так, на экране все появляется но при нажатии клавиши Enter курсор просто перескакивает на очередное окошко и продолжает редактирование.
Функция применяется в АРМе склад на проверке документов перед записью.
И еще она никак не выделена, я пробовал такой код:
Код
shadowbox('[ Ввод пароля ]',nrow, ncol, nrow+5, ncol+20)
@ nrow+4,ncol+3 SAY "Пароль.:" COLOR 'w/bg'//COL_SHEADR
Pas:=GETSECRET( Pas, nrow+4, ncol+12, .F.)
READ
но ShadowBox() появляется в разных местах экрана в зависимости активного окошка, а @...SAY выводится всегда в одно и тоже место.
и еще ругается что переменная COL_SHEADR не определена, я думал это какойто стандартный цвет.
Извиняюсь, если программу трассировать то все работает,
только что-то не сохраняется,
вот полный текст
Код
unction iWarning
// R- return, B - не опасные, O - опасные
Private O:=.F., B:=.F., C, I, R:=.T., W, N, UC, Pas, Pas1:="ПтгцЕ", Pas2:="Ghjkju", nrow:=3, ncol:=5
//Altd()
UC := LEFT(_USER_CODE,2)
IF UC<>"16"
N = GetKolMat()
Pas := " "
FOR I = 1 to N
C = GetMat(I,79, 5)
IF C =="00029"
O =.T.
ELSE
IF C =="00001" .OR. C =="00002" .OR. C =="00003" .OR. C =="00012" .OR. C =="00020"
B =.T.
ENDIF
ENDIF
NEXT
IF O .AND. B
R = .F.
ELSE
R = .T.
ENDIF
IF R = .F.
shadowbox('[ Ввод пароля ]',nrow, ncol, nrow+5, ncol+20)
@ nrow+4,ncol+3 SAY "Пароль.:" COLOR 'w/bg'//COL_SHEADR
Pas:=GETSECRET( Pas, nrow+4, ncol+12, .F.)
READ
IF Pas == Pas1 .OR. Pas==Pas2
F:=.T.
ENDIF
// SayAndWait("Нельзя сохранить! Ха-Ха!")
ENDIF
ENDIF
Return R
может подскажете что нибудь, без проверки пароля все работало.
Сергей Иваницкий пишет:
что-то не так, на экране все появляется но при нажатии клавиши Enter курсор просто перескакивает на очередное окошко и продолжает редактирование
Добавьте перед READ оператор
Код
getlist:=array(0)
Цитата
Сергей Иваницкий пишет:
и еще ругается что переменная COL_SHEADR не определена, я думал это какойто стандартный цвет
Стандартный, но он не хранится в переменной, а подставляется препроцессором при компиляции. Поставьте вместо COL_SHEADR сразу значение - 'gr+/b*,w+/n,,,w+/b*'
Цитата
Сергей Иваницкий пишет:
но ShadowBox() появляется в разных местах экрана в зависимости активного окошка
shadowbox использует координаты относительно окна, установленного wopen(). Нарисуйте рамку сами с использованием @ по абсолютным координатам.
L:=20
J:=3
IF R = .F.
@ nrow,ncol SAY Chr(201)+Replicate(Chr(205),1)+'[ Ввод пароля ]'+Replicate(Chr(205),L-16)+Chr(187) COLOR "GR+/RB"
FOR I = 1 to J
@ nrow+I,ncol SAY Chr(186)+Replicate(" ",L)+Chr(186) COLOR "GR+/RB"
NEXT
@ nrow+J+1,ncol SAY Chr(200)+Replicate(Chr(205),L)+Chr(188) COLOR "GR+/RB"
@ nrow+2,ncol+3 SAY "Пароль.:" COLOR 'GR+/RB'//COL_SHEADR
Pas:=GETSECRET( Pas, nrow+2, ncol+12, .F.)
getlist:=array(0)
READ
IF AllTrim(Pas) == Pas1 .OR. AllTrim(Pas)==Pas2
R:=.T.
ENDIF
ENDIF
В общем работает, но если нажать Esc или неверный пароль то не всегда рамка исчезает
вернее опять зависит от активного окошка, Как заставить перерисоваться?