|
|
|
delete for
|
|||
|---|---|---|---|
|
#18+
Есть таблица, которая заполняется добавлением в нее курсоров (пользователь выбирает текствый файл он преобразуется в табличку). Таблица следующего вида: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 - это промежуточный курсор в котором либо новая информация (Вообще по другой станции), либо старая (которая в точно таком же виде есть в общей таблице), либо информация которая частично есть в таблице. Очень прошу помощи, заранее благодарна ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.11.2005, 10:43:46 |
|
||
|
delete for
|
|||
|---|---|---|---|
|
#18+
Почитайте форум, мы где-то обсуждали этот вопрос - репликации данных... Мне не нравится Ваш подход в принципе - лучше делать сразу - все или ничего, а на отправляющем клиенте данный резать на равные куски (разумной длины) и отправлять их, кроме того вести протокол - оправлено, подтверждено... Good luck! P.S.1 Вместо больших комманд DELETE and APPEND я бы написал вручную так, чтобы использовать удаленные записи и избежать ночной упаковки данных... P.S.2 А нельзя ли вместо модемного дозвона использовать что-то посовременней типа Интернета и Web Services? Тогда не нужны будут операторы и процесс передачи можно будет автоматизировать... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.11.2005, 10:54:31 |
|
||
|
delete for
|
|||
|---|---|---|---|
|
#18+
Нет к сожалению с условием задачи сделать ничего нельзя и хоть нравится или не нравится, а условия такие: дошел файл нормально тут все два баяна рвут от радости, а нет, то добавляют то что есть, потом когда(если) прийдет нормальный файл заменяем портачный файл на нормальный. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.11.2005, 10:58:40 |
|
||
|
delete for
|
|||
|---|---|---|---|
|
#18+
Я так понимаю Tableupdate() используется когда человек ручками вносит данные, а если мне надо добавить курсор я же не могу использовать эту функцию, да? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.11.2005, 11:26:34 |
|
||
|
delete for
|
|||
|---|---|---|---|
|
#18+
air1Я так понимаю Tableupdate() используется когда человек ручками вносит данные, а если мне надо добавить курсор я же не могу использовать эту функцию, да? А при чем здесь TableUpdate()? Она вообще к этому вопросу не относится. Эта команда сбрасывает буфер в исходную таблицу. Как именно был модифицирован буфер, ручками, по одной записи за раз, или одной командой APPEND FROM никакого значения не имеет. Другой вопрос режим буферизации (строковый или табличный). Просто при строковой буферизации (2 или 3) при определенных обстоятельствах сброс буфера происходит автоматически. Без команды TableUpdate(). Кстати, я так и не понял, в чем собственно был вопрос по основной теме? Ты изложила свой способ. Вариантов решения всего 2: Все удалить, создать заново (что ты и сделала) Если записи существуют - заменить, лишние - удалить, недостающие - добавить В твоем случае, думаю, нет смысла как-то "мудрить". Удалить/Вставить вполне сойдет. Только не надо создавать индекс "на лету". Либо сделай его постоянным, либо используй для поиска команду LOCATE (для нее индекс не обязателен) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.11.2005, 11:58:30 |
|
||
|
delete for
|
|||
|---|---|---|---|
|
#18+
Дело в том что, так как пишуя получается, что если таблица хоть чуть - чуть отличается (например на одну запись больше, а все остальные совпадают), то оно просто добавляет даже не видит, что все записи кроме одной одинаковые ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.11.2005, 12:11:56 |
|
||
|
delete for
|
|||
|---|---|---|---|
|
#18+
air1Дело в том что, так как пишуя получается, что если таблица хоть чуть - чуть отличается (например на одну запись больше, а все остальные совпадают), то оно просто добавляет даже не видит, что все записи кроме одной одинаковые Правильно делает. Да, работа несколько избыточная. Но ты представляешь, что нужно сделать, чтобы сравнить 2 набора записей? Ты рассматриваешь простейший вариант. Но, в общем случае, чтобы найти расхождение в наборах записей придется писать относительно сложную процедуру. Точнее, сама-то процедура не сложная, но время работы такой процедуры будет значительно бОльшим, чем просто Удалить/Вставить. Пусть даже вообще не было никаких расхождений. Если бы в поставляемом файле существовал уникальный идентификатор записи, то задача поиска изменений существенно упростилась бы. Однако не факт, что такая работа окажется быстрее, чем полное удаление и вставка. Тут много дополнительных факторов. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.11.2005, 12:26:27 |
|
||
|
delete for
|
|||
|---|---|---|---|
|
#18+
Дело в том, что в поставляемом файле есть - название файла+дата, По ней мне и надо удалять, собственно что я и пытаюсь сделать. И почему - то не получается. Кстати я создала индекс в самой таблице и больше его не перезаписываю. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.11.2005, 12:46:27 |
|
||
|
delete for
|
|||
|---|---|---|---|
|
#18+
air1Дело в том, что в поставляемом файле есть - название файла+дата, По ней мне и надо удалять, собственно что я и пытаюсь сделать. И почему - то не получается. Кстати я создала индекс в самой таблице и больше его не перезаписываю. "Это же совсем другое дело!" Ну, для начала, меня сильно удивляет, что ты проверяешь факт наличия по Имени и дате, удаляешь по Имени+дата+Код, а добавляешь вообще все без разбора. Далее, ты создаешь индекс по выражению: Имя+Дата, но поиск (удаление) происходит по имени и дате отдельно. В данном случае - это не важно, но вообще-то, не есть хорошо. Получается ищешь одно, а удаляешь - другое. На последок, стандартный вопрос о кодовых страницах. Что возвращает функция Код: plaintext На этапе отлдки приложения и в готовом EXE. Какая кодовая страница у файла DBF? Проверить можно через функцию Код: plaintext 1. 2. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.11.2005, 13:39:14 |
|
||
|
delete for
|
|||
|---|---|---|---|
|
#18+
ВладимирМ air1Дело в том, что в поставляемом файле есть - название файла+дата, По ней мне и надо удалять, собственно что я и пытаюсь сделать. И почему - то не получается. Кстати я создала индекс в самой таблице и больше его не перезаписываю. "Это же совсем другое дело!" Ну, для начала, меня сильно удивляет, что ты проверяешь факт наличия по Имени и дате, удаляешь по Имени+дата+Код, а добавляешь вообще все без разбора. Далее, ты создаешь индекс по выражению: Имя+Дата, но поиск (удаление) происходит по имени и дате отдельно. В данном случае - это не важно, но вообще-то, не есть хорошо. Получается ищешь одно, а удаляешь - другое. На последок, стандартный вопрос о кодовых страницах. Что возвращает функция Код: plaintext На этапе отлдки приложения и в готовом EXE. Какая кодовая страница у файла DBF? Проверить можно через функцию Код: plaintext 1. 2. cpcurrent() - возвращает установку кодовой страницы (если такая существует) в файле конфигурации или возвращает текущую кодовую страницу операционной системы, а функция cpdbf() - возвращает кодовую страницу, которой была помечена открытая таблица. В моем случае - это 1251, так как до этого я как раз перевожу кодировку из Dos 866 в Windows 1251. Только я не поняла как мне это может помочь. Сейчас я убрала в удалении код станции. И я хотела спросить как проводить в моем случае поиск(удаление) и по дате и по названию файла одновременно. Я же вроде пишу and, а не or, думала я так провожу поиск(удаление) и по дате и по названию файла одновременно. В том случае, если портачные данные удачно удалены (то есть удалены все данные, которые имеют такое же название файла и такую же дату как и в новом созданном курсоре). Мне надо полностью добавить курсор с новыми данными. Я так понимаю мне и не надо добавлять их по какому то условию. Я уже бьюсь над решением этой задачи 3 дня и уже начинаю отчаиваться. Помогите пожалуйста. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.11.2005, 15:18:36 |
|
||
|
delete for
|
|||
|---|---|---|---|
|
#18+
Ну, цитировать HELP не обязательно. Я имел в виду тот факт, что запись может не быть найдена, если нет соответствия кодовых страниц. Вообще-то, в самом общем виде код должен выглядеть как-то так: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. В такой схеме индекс вообще-то не нужен. Но для ускорения поиска по LOCATE надо создать 2 индекса INDEX ON NameF TAG NameF INDEX ON dt TAG dt Твоя ошибка, вероятно, заключается в том, что при удалении ты используешь значения текущей записи таблицы PromReestr. Команда DELETE "движется" только по записям таблицы в текущей рабочей области. Указатель записей в таблицах из других рабочих областей не перемещается (можно его заставить перемещаться, но это отдельный вопрос). Весь вопрос в том, какая же запись была текущей в таблице PromReestr на момент подачи команды DELETE. Если это была запись за последней записью (EOF()=.T.), то команда DELETE ничего и не удалит. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.11.2005, 17:36:26 |
|
||
|
delete for
|
|||
|---|---|---|---|
|
#18+
air1Нет к сожалению с условием задачи сделать ничего нельзя и хоть нравится или не нравится, а условия такие: дошел файл нормально тут все два баяна рвут от радости, а нет, то добавляют то что есть, потом когда(если) прийдет нормальный файл заменяем портачный файл на нормальный. Понятно, печально... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.11.2005, 17:49:17 |
|
||
|
delete for
|
|||
|---|---|---|---|
|
#18+
Огромное спасибо всем, кто мне написал. Все получилось. Кстати, а расширение *.zzz - это что? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.11.2005, 19:12:15 |
|
||
|
delete for
|
|||
|---|---|---|---|
|
#18+
air1Кстати, а расширение *.zzz - это что? Подозреваю, что ничего... Иногда используют такой примитивный способ защиты данных - изменяют расширение файла. Например, вместо DBF пишут DAT. Для FoxPro, если указать расширение явно - это не играет никакой роли, но не искушенный пользователь может подумать, что это как-то хитро зашифрованные данные Возможно, в данном случае сделали то же самое. Попробуй выяснить, что именно так было переименовано (текстовый файл, ZIP-архив, что-то еще...) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.11.2005, 19:53:41 |
|
||
|
|

start [/forum/topic.php?fid=41&fpage=292&tid=1593058]: |
0ms |
get settings: |
8ms |
get forum list: |
16ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
68ms |
get topic data: |
10ms |
get forum data: |
3ms |
get page messages: |
49ms |
get tp. blocked users: |
1ms |
| others: | 208ms |
| total: | 369ms |

| 0 / 0 |
