Posted: 24 Dec 2005 10:26 Post subject: Интересная проблема
Вылезла интересная проблема.
В Товары-учет движения-реализация со склада в реестре вешаю спецфункцию «перед удалением».
Задача: Мне надо разрешить удаление записи только в том случае, если в определенных документах движения ( их надо найти ) еще не были созданы проводки. Но это все не важно. Суть программы в том, что стоя на конкретной записи в MDOC.DBF, надо найти две другие ( в нем же), с такой же датой, тем же номером и кодом документа, с заранее известным складом(существует склад 000001 и 000002), типом и видом движения – эти записи создавались программно. Кое что в них проверить и вернуться на исходную запись. Кроме стандартных создан вид движения с видом=2, типом "А"
1) Проверяем через BRO.EXE – записи есть, все реквизиты такие, как и ожидаем. При открытом индексе MDOC_D через команду SEEK записи отлично находятся.
2) Заходим в программу, встаем в реестре на интересующую нас запись, F8, запускается спецфункция. Заходим в отладчик. Открыт( и является текущим) файл MDOC, стоим на нашей записи, Index order=1, т.е. индекс MDOC_D (ключ SCLAD+VID+TIP+DTOS(DATA)+CODEDOC+NUMDOC), да и этот ключ виден. Все отлично. Формируем ключ поиска… DBSeek.. и запись не находится. Пробуем просто mdoc->(DBGoTop()) – тоже не работает. Помучилась и так и этак. Вставляла всякие глупые прверки( типа IndexKey(), IndexOrd и всякие другие), потом вернулась к первоначальному варианту, только вставила кусок, в котором закрыла файл MDOC и открыла его снова… и .. о чудо – все заработало. Это конечно, хорошо. Но хотелось бы на будущее понять, какой в этом смысл. И почему не работало без этой вставки?
Текст всей программы привожу(немного обрезанный, но тут есть все к интересующему меня вопросу):
function main()
local n:=recno(),scl:= "",cd:= "",nd:= "",dat:= date(),ldel := .t.,kod1:="",kod2:= ""
altd()
dbpush()
scl :=mdoc->sclad
cd :=mdoc->codedoc
nd :=mdoc->numdoc
dat :=mdoc->date
kod1:= scl+"12"+dtos(dat)+cd+nd
kod2:="0000022A"+dtos(dat)+cd+nd
// Пришлось вставить этот кусок
mdoc->(DBCloseArea())
NetUse("MDOC",loadpath()+"\SCLAD\MDOC.DBF",,.f.)
MDOC->(OrdSetFocus("MDOC_D"))
MDOC->(dbgotop()) // это была просто проверка, что что-то движется
/// конец вставленного куска
if mdoc->(dbseek(upper(kod1)))
if !empty(mdoc->pro)
lDel := .f.
endif
else
alert("no") // это вставлено уже в процессе поиска ошибки
endif
if mdoc->(dbseek(upper(kod2)))
if !empty(mdoc->pro)
lDel := .f.
endif
else
alert("no")
endif
if !ldel
Alert("Удаление невозможно, созданы проводки.;Удалите смежные документы вручную",,"15/5")
mdoc->(DBGoto(n))
dbpop()
return lDel
endif
Del_Prix()
mdoc->(Reclock())
mdoc->(dbDelete())
mdoc->(f_dbunlock())
sayAndWait("Удалено!")
dbpop()
return ldel
****************
даже этот маленький тест выдавал “no”:
function main()
local k:= ""
altd()
k := "000002"
if mdoc->(dbseek(k))
sayAndWait("Yes")
else
sayAndWait("no")
endif
return nil
Это не выход. И вообще некорректно, если я хочу выполнять какие-то удаления в файле. И вопрос не в том, как сделать, а в том, почему в данной ситуации не работают стандартные функции?
Joined: 26 Jul 2002 Posts: 975 Location: Титов Александр Александрович Occupation: Компания БЭСТ Interests: Москва
Posted: 25 Dec 2005 12:34 Post subject:
Светлана wrote:
Это не выход. И вообще некорректно, если я хочу выполнять какие-то удаления в файле. И вопрос не в том, как сделать, а в том, почему в данной ситуации не работают стандартные функции?
Добрый день!
В прорамме MDOC открывается с определенным Scope, возможно, что созданные Вами записи не удовлетворяют условию видимости. Обратите также внимание, какой текущий индекс в данный момент установлен и на FOR-условие индекса. Для этого можно, например, в отладчике посмотреть состояние рабочих областей по F6, или ручками сделать dbseek в разных вариантах и посмотреть результат. _________________ С уважением, Александр Титов, Компания БЭСТ, Москва, отдел разрабо
Joined: 10 Oct 2003 Posts: 342 Location: Александр Occupation: Специалист Interests: Калининград
Posted: 25 Dec 2005 14:30 Post subject:
Честно говоря, я тоже подумал про scope
Я всегда в начале сбрасываю его пустым скопом с сохранением в переменной, а в конце востанавливаю?
Как раз в вашем случае это, точно это - потому что когда входите в какой-то вид движения и выбираете склад, как раз и накладывается скоп. А вы пытаетесь искать и то и другое, отличное от текущего!
Большое спасибо за советы! Со Scope все получилось. Жаль, что его не видно в отладчике, хоть, конечно, могла бы и сама подумать. Смотрела только на условие индекса...
You cannot post new topics in this forum You cannot reply to topics in this forum You cannot edit your posts in this forum You cannot delete your posts in this forum You cannot vote in polls in this forum