BEST logo логотип компании БЭСТ - программы для бизнеса ПРОДАЖИ
+7 (991) 312-04-37
trade@bestnet.ru
ПОДДЕРЖКА
+7 (495) 775-66-76
consult@bestnet.ru
СКАЧАТЬ
Обновления
Дистрибутивы
Авторизация

Логин:
Пароль:
Забыли свой пароль?
Регистрация
ВАШ ВОПРОС

Доступ к Личному кабинету закрыт!
Как получить доступ?


Форум

Поиск  Пользователи  Правила 
Закрыть
Логин:
Пароль:
Забыли свой пароль?
Регистрация
Войти
 
Страницы: 1
RSS
Криво работает F_SETRELATION у меня
 
Добрый день,
Пытаюсь написать не сложный код на Б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 без учета
Код
DOCS->(F_SETRELATION("MAIN","PRO"))

Может кто нибудь скажет что я делаю не так?
 
Добрый день.

Отношение (relations) пересчитывается при изменении номера записи в родительской базе ('docs'). При этом указатель в дочерней базе ('main') устанавливается на запись, соответствующую выражению связи. Единовременно. При этом никаких дополнительных ограничений на передвижение указателя по дочерней (main) базе не вводится. Сделали dbgotop() - получили указатель на первой записи.
В вашем случает надо изменить условие цикла, выкинуть dbgotop() и перебирать записи, пока docs->pro=main->nnoper, поскольку при установленной связи указатель автоматически переместится на первую запись в main, с сответствующим значением nnoper.
Второй вариант - установка setscope на main и обработка всех записей main, попавших в скоп.
С уважением, Новиков Алексей.
 
Спасибо большое за оперативность.
Можно тогда еще Вопрос, обязательно ли для Main в данном случае использовать индекс TAG_NNOPER или можно использовать другой индекс и скоп?
 
Добрый день.

Только 'tag_nnoper', поскольку нет другой возможности установить связь между mdoc и main, кроме связи mdoc->pro = main->nnoper.
С уважением, Новиков Алексей.
 
спасибо, я так и думал,а можно Вопрос не втему. Есть функция
DIALOG(<текст запроса>,<формат ввода>,<значение по умолчанию>) можно ли с ее помощью пароль вводить, т.е. есть ли такой формат чтобы звездочками заменял?
 
Добрый день.

В БЭСТ-4 такую функцию исполняет функция GetSecret. Пример:
Код
      @ 17,20 SAY "Пароль.:" COLOR COL_SHEADR 
      a5:=GETSECRET( a5, 17, 29, .F.)
      READ
С уважением, Новиков Алексей.
 
Спасибо,
Как я понял
Цитата

a5:=GETSECRET( a5, 17, 29, .F.)

17, 29 - это начальная позиция,
a5 очевидно значение по умолчанию а вот .F. что-такое?
 
Добрый день.

А .F. - это ничего. Можете не указывать этот параметр. Совсем.
С уважением, Новиков Алексей.
 
Спасибо.
попробую
 
Еще вопросик, не по теме, чем отличается объявление переменных LOCAL от PRIVATE?
 
Нашел описание, спасибо.
 
Здравствуйте, Алексей.
Попробовал использовать 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(). Нарисуйте рамку сами с использованием @ по абсолютным координатам.
С уважением, Новиков Алексей.
 
Добрый день.

Цитата
Сергей Иваницкий пишет:
IF Pas == Pas1 .OR. Pas==Pas2
F:=.T.
ENDIF


Откуда у Вас вдруг 'F' взялось?

"Не работает!? Ха-ха"
С уважением, Новиков Алексей.
 
упс!
Спасибо R конечно же, просмотрел.
 
Переделал, вот так:
Код
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 или неверный пароль то не всегда рамка исчезает
вернее опять зависит от активного окошка, Как заставить перерисоваться?
 
да nrow:=10 ncol:=30
 
Добрый день.

До ввода пароля добавьте что-то вроде:
Код
    a3:=SaveScreen()

После ввода пароля:
Код
    RestScreen(,,,,a3)

Это избавит от проблем с экраном.
С уважением, Новиков Алексей.
 
Спасибо,
попробую.
Я правда обошел проблему, загнал свое окошко в правое верхнее окошко, где проводки, оно как выяснилось всегда перерисовывается.
 
А на это не ругается? :surprise:
Код
[COLOR=red]unction[/COLOR] My_Calc 
.......
Return
 
Добрый день.

Цитата
E.J. пишет:
А на это не ругается?

Коллега, видимо, просто некорректно скопировал листинг. Иначе он бы не добрался до тех ошибок, которые описывал.
С уважением, Новиков Алексей.
 
Большое всем спасибо, все работает.
Страницы: 1
Читают тему (гостей: 1)