Главная
Новый форум
 FAQFAQ   SearchSearch   MemberlistMemberlist   UsergroupsUsergroups   RegisterRegister 
 ProfileProfile   Log in to check your private messagesLog in to check your private messages   Log inLog in 

Интересная проблема

 
Post new topic   Reply to topic   printer-friendly view     Forum Index -> Программирование в БЭСТ-4
View previous topic :: View next topic  
Author Message
Светлана



Joined: 22 Jul 2002
Posts: 416
Location: Эпштейн Светлана

Interests: Бердск, Новосибирская обл

PostPosted: 24 Dec 2005 10:26    Post subject: Интересная проблема Reply with quote

Вылезла интересная проблема.
В Товары-учет движения-реализация со склада в реестре вешаю спецфункцию «перед удалением».
Задача: Мне надо разрешить удаление записи только в том случае, если в определенных документах движения ( их надо найти ) еще не были созданы проводки. Но это все не важно. Суть программы в том, что стоя на конкретной записи в 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
Back to top
View user's profile Send private message Send e-mail
maestro_



Joined: 29 Jan 2003
Posts: 95



PostPosted: 24 Dec 2005 10:46    Post subject: Reply with quote

А может стоит открыть вторую копию mdoc - например с алиасом mdoc2 и работать с ни
Back to top
View user's profile Send private message
Светлана



Joined: 22 Jul 2002
Posts: 416
Location: Эпштейн Светлана

Interests: Бердск, Новосибирская обл

PostPosted: 25 Dec 2005 09:02    Post subject: Reply with quote

Это не выход. И вообще некорректно, если я хочу выполнять какие-то удаления в файле. И вопрос не в том, как сделать, а в том, почему в данной ситуации не работают стандартные функции?
Back to top
View user's profile Send private message Send e-mail
Титов Александр



Joined: 26 Jul 2002
Posts: 975
Location: Титов Александр Александрович
Occupation: Компания БЭСТ
Interests: Москва

PostPosted: 25 Dec 2005 12:34    Post subject: Reply with quote

Светлана wrote:
Это не выход. И вообще некорректно, если я хочу выполнять какие-то удаления в файле. И вопрос не в том, как сделать, а в том, почему в данной ситуации не работают стандартные функции?

Добрый день!
В прорамме MDOC открывается с определенным Scope, возможно, что созданные Вами записи не удовлетворяют условию видимости. Обратите также внимание, какой текущий индекс в данный момент установлен и на FOR-условие индекса. Для этого можно, например, в отладчике посмотреть состояние рабочих областей по F6, или ручками сделать dbseek в разных вариантах и посмотреть результат.
_________________
С уважением, Александр Титов, Компания БЭСТ, Москва, отдел разрабо
Back to top
View user's profile Send private message Visit poster's website
shura_k



Joined: 10 Oct 2003
Posts: 342
Location: Александр
Occupation: Специалист
Interests: Калининград

PostPosted: 25 Dec 2005 14:30    Post subject: Reply with quote

Честно говоря, я тоже подумал про scope
Я всегда в начале сбрасываю его пустым скопом с сохранением в переменной, а в конце востанавливаю?

Как раз в вашем случае это, точно это - потому что когда входите в какой-то вид движения и выбираете склад, как раз и накладывается скоп. А вы пытаетесь искать и то и другое, отличное от текущего!
Back to top
View user's profile Send private message
Светлана



Joined: 22 Jul 2002
Posts: 416
Location: Эпштейн Светлана

Interests: Бердск, Новосибирская обл

PostPosted: 26 Dec 2005 07:04    Post subject: Reply with quote

Большое спасибо за советы! Со Scope все получилось. Жаль, что его не видно в отладчике, хоть, конечно, могла бы и сама подумать. Смотрела только на условие индекса...
Back to top
View user's profile Send private message Send e-mail
Display posts from previous:   
Post new topic   Reply to topic   printer-friendly view     Forum Index -> Программирование в БЭСТ-4 All times are GMT + 4 Hours
Page 1 of 1

 
Jump to:  
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


Powered by phpBB © phpBB Group

Rambler
Rambler's Top100 Рейтинг@Mail.ru