powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / delete for
14 сообщений из 14, страница 1 из 1
delete for
    #33378278
air1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Есть таблица, которая заполняется добавлением в нее курсоров (пользователь выбирает текствый файл он преобразуется в табличку). Таблица следующего вида:cod_podr,dt(дата),n_ved,p3,p4,p5,p6,p7,p8,p9,p10,p11,Namef(название текстовогофайла). А вопрос вот в чем, если человек второй раз выбрал один и тот же текстовый файл, надо у него спросить: Заменить имеющийся? И если ответ да, то надо удалить те записи, у которых такое же название файла и такая же дата. И на место удаленных запесей добавить новый сформированный курсор. При чем вполне вероятно, что новый курсор будет с другим количеством записей, но поля будут точно такие же, к примеру збросили информацию по модему, кто - то схватил трубку и информация дошла не вся, но ее все равно добавили в общий курсор, а потом пришла информация уже полностью, то есть надо убрать неполную информацию, а добавить нормальную. Я пишу так:

select reestr
INDEX ON allTRIM(namef)+allTRIM(dt) TAG dtnamef
if seek(m.NameFile+dt,'reestr','dtnamef')
lnAnswer = MESSAGEBOX("Такой реестр уже есть, заменить уже имеющийся?", 4+48,"Замена реестров" )
if lnAnswer=6
delete for alltrim(reestr.namef)=alltrim(promreestr.Namef) and alltrim(reestr.dt)=alltrim(promreestr.dt) and alltrim(reestr.cod_podr)=alltrim(promreestr.cod_podr)
append from dbf('promreestr')
endif
else
append from dbf('promreestr')
endif


reestr - реестр это общая таблица, а promreestr - это промежуточный курсор в котором либо новая информация (Вообще по другой станции), либо старая (которая в точно таком же виде есть в общей таблице), либо информация которая частично есть в таблице.
Очень прошу помощи, заранее благодарна
...
Рейтинг: 0 / 0
delete for
    #33378325
Sergey Ch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Почитайте форум, мы где-то обсуждали этот вопрос - репликации данных...

Мне не нравится Ваш подход в принципе - лучше делать сразу - все или ничего, а на отправляющем клиенте данный резать на равные куски (разумной длины) и отправлять их, кроме того вести протокол - оправлено, подтверждено...

Good luck!

P.S.1 Вместо больших комманд DELETE and APPEND я бы написал вручную так, чтобы использовать удаленные записи и избежать ночной упаковки данных...

P.S.2 А нельзя ли вместо модемного дозвона использовать что-то посовременней типа Интернета и Web Services? Тогда не нужны будут операторы и процесс передачи можно будет автоматизировать...
...
Рейтинг: 0 / 0
delete for
    #33378346
air1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Нет к сожалению с условием задачи сделать ничего нельзя и хоть нравится или не нравится, а условия такие: дошел файл нормально тут все два баяна рвут от радости, а нет, то добавляют то что есть, потом когда(если) прийдет нормальный файл заменяем портачный файл на нормальный.
...
Рейтинг: 0 / 0
delete for
    #33378444
air1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я так понимаю Tableupdate() используется когда человек ручками вносит данные, а если мне надо добавить курсор я же не могу использовать эту функцию, да?
...
Рейтинг: 0 / 0
delete for
    #33378570
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
air1Я так понимаю Tableupdate() используется когда человек ручками вносит данные, а если мне надо добавить курсор я же не могу использовать эту функцию, да?
А при чем здесь TableUpdate()? Она вообще к этому вопросу не относится.

Эта команда сбрасывает буфер в исходную таблицу. Как именно был модифицирован буфер, ручками, по одной записи за раз, или одной командой APPEND FROM никакого значения не имеет.

Другой вопрос режим буферизации (строковый или табличный). Просто при строковой буферизации (2 или 3) при определенных обстоятельствах сброс буфера происходит автоматически. Без команды TableUpdate().

Кстати, я так и не понял, в чем собственно был вопрос по основной теме? Ты изложила свой способ. Вариантов решения всего 2:

Все удалить, создать заново (что ты и сделала)

Если записи существуют - заменить, лишние - удалить, недостающие - добавить

В твоем случае, думаю, нет смысла как-то "мудрить". Удалить/Вставить вполне сойдет.

Только не надо создавать индекс "на лету". Либо сделай его постоянным, либо используй для поиска команду LOCATE (для нее индекс не обязателен)
...
Рейтинг: 0 / 0
delete for
    #33378619
air1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дело в том что, так как пишуя получается, что если таблица хоть чуть - чуть отличается (например на одну запись больше, а все остальные совпадают), то оно просто добавляет даже не видит, что все записи кроме одной одинаковые
...
Рейтинг: 0 / 0
delete for
    #33378692
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
air1Дело в том что, так как пишуя получается, что если таблица хоть чуть - чуть отличается (например на одну запись больше, а все остальные совпадают), то оно просто добавляет даже не видит, что все записи кроме одной одинаковые
Правильно делает. Да, работа несколько избыточная. Но ты представляешь, что нужно сделать, чтобы сравнить 2 набора записей?

Ты рассматриваешь простейший вариант. Но, в общем случае, чтобы найти расхождение в наборах записей придется писать относительно сложную процедуру. Точнее, сама-то процедура не сложная, но время работы такой процедуры будет значительно бОльшим, чем просто Удалить/Вставить. Пусть даже вообще не было никаких расхождений.

Если бы в поставляемом файле существовал уникальный идентификатор записи, то задача поиска изменений существенно упростилась бы. Однако не факт, что такая работа окажется быстрее, чем полное удаление и вставка. Тут много дополнительных факторов.
...
Рейтинг: 0 / 0
delete for
    #33378777
air1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дело в том, что в поставляемом файле есть - название файла+дата, По ней мне и надо удалять, собственно что я и пытаюсь сделать. И почему - то не получается. Кстати я создала индекс в самой таблице и больше его не перезаписываю.
...
Рейтинг: 0 / 0
delete for
    #33379001
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
air1Дело в том, что в поставляемом файле есть - название файла+дата, По ней мне и надо удалять, собственно что я и пытаюсь сделать. И почему - то не получается. Кстати я создала индекс в самой таблице и больше его не перезаписываю.
"Это же совсем другое дело!"

Ну, для начала, меня сильно удивляет, что ты проверяешь факт наличия по Имени и дате, удаляешь по Имени+дата+Код, а добавляешь вообще все без разбора.

Далее, ты создаешь индекс по выражению: Имя+Дата, но поиск (удаление) происходит по имени и дате отдельно. В данном случае - это не важно, но вообще-то, не есть хорошо. Получается ищешь одно, а удаляешь - другое.

На последок, стандартный вопрос о кодовых страницах.

Что возвращает функция

Код: plaintext
?CPCURRENT()

На этапе отлдки приложения и в готовом EXE.

Какая кодовая страница у файла DBF? Проверить можно через функцию

Код: plaintext
1.
2.
select reestr
?CPDBF()
...
Рейтинг: 0 / 0
delete for
    #33379398
air1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ВладимирМ air1Дело в том, что в поставляемом файле есть - название файла+дата, По ней мне и надо удалять, собственно что я и пытаюсь сделать. И почему - то не получается. Кстати я создала индекс в самой таблице и больше его не перезаписываю.
"Это же совсем другое дело!"

Ну, для начала, меня сильно удивляет, что ты проверяешь факт наличия по Имени и дате, удаляешь по Имени+дата+Код, а добавляешь вообще все без разбора.

Далее, ты создаешь индекс по выражению: Имя+Дата, но поиск (удаление) происходит по имени и дате отдельно. В данном случае - это не важно, но вообще-то, не есть хорошо. Получается ищешь одно, а удаляешь - другое.

На последок, стандартный вопрос о кодовых страницах.

Что возвращает функция

Код: plaintext
?CPCURRENT()

На этапе отлдки приложения и в готовом EXE.

Какая кодовая страница у файла DBF? Проверить можно через функцию

Код: plaintext
1.
2.
select reestr
?CPDBF()


cpcurrent() - возвращает установку кодовой страницы (если такая существует) в файле конфигурации или возвращает текущую кодовую страницу операционной системы, а функция cpdbf() - возвращает кодовую страницу, которой была помечена открытая таблица. В моем случае - это 1251, так как до этого я как раз перевожу кодировку из Dos 866 в Windows 1251. Только я не поняла как мне это может помочь.

Сейчас я убрала в удалении код станции. И я хотела спросить как проводить в моем случае поиск(удаление) и по дате и по названию файла одновременно. Я же вроде пишу and, а не or, думала я так провожу поиск(удаление) и по дате и по названию файла одновременно.
В том случае, если портачные данные удачно удалены (то есть удалены все данные, которые имеют такое же название файла и такую же дату как и в новом созданном курсоре). Мне надо полностью добавить курсор с новыми данными. Я так понимаю мне и не надо добавлять их по какому то условию. Я уже бьюсь над решением этой задачи 3 дня и уже начинаю отчаиваться. Помогите пожалуйста.
...
Рейтинг: 0 / 0
delete for
    #33379798
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну, цитировать HELP не обязательно. Я имел в виду тот факт, что запись может не быть найдена, если нет соответствия кодовых страниц.

Вообще-то, в самом общем виде код должен выглядеть как-то так:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
SET DELETED ON
SET TALK OFF

LOCAL lnAnswer, llAppend
llAppend = .T.
SELECT Reestr
SET ORDER TO  0 
LOCATE FOR NameF = AllTrim(m.NameFile) AND dt = AllTrim(m.dt)
IF FOUND()=.T.
	lnAnswer = MESSAGEBOX("Такой реестр уже есть, заменить уже имеющийся?",  4 + 48 ,"Замена реестров" )
	IF lnAnswer =  6 
		DELETE FOR NameF = AllTrim(m.NameFile) AND dt = AllTrim(m.dt)
	ELSE
		llAppend = .F.
	ENDIF
ENDIF
IF m.llAppend = .T.
	APPEND FROM PromReestr.dbf
ENDIF

В такой схеме индекс вообще-то не нужен. Но для ускорения поиска по LOCATE надо создать 2 индекса

INDEX ON NameF TAG NameF
INDEX ON dt TAG dt

Твоя ошибка, вероятно, заключается в том, что при удалении ты используешь значения текущей записи таблицы PromReestr. Команда DELETE "движется" только по записям таблицы в текущей рабочей области. Указатель записей в таблицах из других рабочих областей не перемещается (можно его заставить перемещаться, но это отдельный вопрос).

Весь вопрос в том, какая же запись была текущей в таблице PromReestr на момент подачи команды DELETE. Если это была запись за последней записью (EOF()=.T.), то команда DELETE ничего и не удалит.
...
Рейтинг: 0 / 0
delete for
    #33379836
Sergey Ch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
air1Нет к сожалению с условием задачи сделать ничего нельзя и хоть нравится или не нравится, а условия такие: дошел файл нормально тут все два баяна рвут от радости, а нет, то добавляют то что есть, потом когда(если) прийдет нормальный файл заменяем портачный файл на нормальный.
Понятно, печально...
...
Рейтинг: 0 / 0
delete for
    #33380003
air1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Огромное спасибо всем, кто мне написал. Все получилось. Кстати, а расширение *.zzz - это что?
...
Рейтинг: 0 / 0
delete for
    #33380066
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
air1Кстати, а расширение *.zzz - это что?
Подозреваю, что ничего...

Иногда используют такой примитивный способ защиты данных - изменяют расширение файла. Например, вместо DBF пишут DAT. Для FoxPro, если указать расширение явно - это не играет никакой роли, но не искушенный пользователь может подумать, что это как-то хитро зашифрованные данные

Возможно, в данном случае сделали то же самое. Попробуй выяснить, что именно так было переименовано (текстовый файл, ZIP-архив, что-то еще...)
...
Рейтинг: 0 / 0
14 сообщений из 14, страница 1 из 1
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / delete for
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]