30.03.2011, 18:06 | #1 |
Пользователь
Регистрация: 19.07.2010
Сообщений: 392
Благодарности: 0
Поблагодарили 76
раз(а) в 76 сообщениях
Обратиться по нику Цитата выделенного |
Такая образовалась проблемка...
Наша Управа заключила соглашение с областным ГИБДД об электронных запросах. Все было в нормальных рамках до тех пор, пока количество направляемых туда запросов ограничивалось 200-300 штуками за день-два. Но сейчас в Управе решили, что делать запросы нужно по всем неоконченным ИП, кроме приостановленных, отсроченных, рассроченных, отложенных. В общем, фильтр для выборки я нарисовал, запросы сделал, отослал, получил ответ. Вот тут-то и порылась собака 200-300 ответов на запросы я могу вполне сносно привести к виду, который можно загрузить в ПК СП (чтобы приставы могли работать с индивидуальными ответами), немного только руками пошевелить приходится (на файл из 300 ответов уходит не более 10 минут). А вот что касается теперешнего ответа, то тут я впал в ступор: количество ответов превысило 7 тыс. записей - обработка такого количества потребует очень много времени, да и вероятность ошибок возрастает в десятки раз. Решил упростить себе задачу - запихал таблицу ответов в Access, прикинул последовательность действий и сел писать модуль. Но вот не получается, хоть ты тресни! Либо не создает ни одной записи, либо создает только первую или только последнюю, либо неправильно условие отрабатывает. В общем, прошу помощи у более знающих коллег. Условие задачи: Нам присылают таблицу ответов на запросы. В таблице одному исходному запросу (код каждого запроса уникален) может соответствовать несколько ответов, в которых отличается только содержание одного поля (текст ответа). Нужно получить конечную таблицу, где каждому уникальному запросу будет соответствовать один ответ, в котором соответствующие поля из нескольких ответов (текст ответа) будут склеены. Что я попробовал набросать Код:
Public Sub resort() Dim RS, RS1, RS2 As Recordset Set RS1 = CurrentDb.OpenRecordset("otvet1", dbOpenDynaset) Set RS2 = CurrentDb.OpenRecordset("otvet2", dbOpenDynaset) RS1.MoveFirst If RS2.EOF Then RS2.AddNew RS2.Update End If RS2.MoveFirst While Not RS1.EOF RS2.Edit RS2.Fields("unicode") = RS1.Fields("unicode") RS2.Fields("result") = RS1.Fields("result") RS2.Fields("text") = RS1.Fields("text") RS2.Fields("req_date") = RS1.Fields("req_date") RS2.Fields("resp_id") = RS1.Fields("resp_id") RS2.Fields("numisp") = RS1.Fields("numisp") RS2.Fields("fioorg") = RS1.Fields("fioorg") RS1.MoveNext While Not RS1.EOF And RS2.Fields("Unicode") = RS1.Fields("Unicode") RS2.Fields("text") = RS2.Fields("text") + RS1.Fields("text") RS1.MoveNext Wend RS2.Update RS2.AddNew Wend End Sub То же самое, что написал, но немного по другому объясню, вдруг так будет более внятно: Есть таблица с определенной структурой (более 7 тыс. записей). Вторая таблица такая же, но пустая (совпадает структура). Алгоритм действий примерно должен выглядеть так: ====== 1. Открываем таблицу 1, переходим к 1-ой записи 2. Открываем таблицу 2, создаем 1-ую запись 3. Присваиваем полям 1-ой записи таблицы 2 значения соответствующих полей 1-ой записи таблицы 1 4. Переходим к следующей записи таблицы 1 5. Если поле KOD новой записи таблицы 1 соответствует полю KOD текущей записи таблицы 2 то к полю TEXT текущей записи таблицы 2 добавляется значение поля TEXT текущей записи таблицы 1 иначе изменения текущей записи таблицы 2 фиксируются, добавляется новая (пустая) запись в таблице 2, переходим на нее 6. повторяем операциии 3-5, пока не закончатся записи в таблице 1 ====== Буду благодарен за любую помощь, т.к. очень похоже, что это указание будет теперь долго действовать. |
В Минюст Цитата Спасибо |
30.03.2011, 18:27 | #2 |
Пользователь
Регистрация: 19.07.2010
Сообщений: 392
Благодарности: 0
Поблагодарили 76
раз(а) в 76 сообщениях
Обратиться по нику Цитата выделенного |
ну примерно так:
Код:
UNICODE RESULT TEXT REQ_DATE RESP_ID 172246 2 МIТSUВISНI LАNСЕR 1.8, цвет КРАСНЫЙ, гос. № 24.03.2011 180750/10 172246 2 ВАЗ 21063, цвет САФАРИ, гос. № 24.03.2011 180750/10 |
В Минюст Цитата Спасибо |
30.03.2011, 21:27 | #3 |
Пользователь
Регистрация: 19.07.2010
Сообщений: 392
Благодарности: 0
Поблагодарили 76
раз(а) в 76 сообщениях
Обратиться по нику Цитата выделенного |
загружается, причем великолепно
но проблему я выше уже обозначил: на один запрос в одном файле может поступить несколько ответов (такова уж софтина у гаишников), а в таком случае ПК СП вносит в базу только последний ответ соответствующий коду запроса, остальные же ответы по этому коду игнорируются т.е., если у гр. Иванова 4 машины, то информация про 4-ую в базу попадет, а про первые 3 - нет |
В Минюст Цитата Спасибо |
30.03.2011, 23:35 | #4 |
Пользователь
Регистрация: 19.07.2010
Сообщений: 392
Благодарности: 0
Поблагодарили 76
раз(а) в 76 сообщениях
Обратиться по нику Цитата выделенного |
полю RESULT присваивается тип ответа: 1 - отрицательный, 2 - положительный
поле TEXT = собственно текст ответа поле DATE_RES = дата ответа (оно же = полю REQ_DATE файла ответов) поле NUM_RES = номер ответа, представляет собой конкатенацию полей NUM_PACK и NUM_ZAPR_IN_PACK, разделенных знаком "/" (например, 164841/13) (оно же = полю RESP_ID файла ответов) поле STATUS = "Ответ" поле DATE_RESP = дата загрузки ответа в базу поле WHY_PREPARE = ФИО сотрудника, загрузившего ответы в базу остальные поля не меняются если текст ответа превышает максимальную длину поля TEXT (500 символов), то полю TEXT значение не присваивается, а сам текст ответа помещается в отдельный файл с названием, соответствующим PK запроса (m111111.txt), название файла помещается в поле FILENAME |
В Минюст Цитата Спасибо |
31.03.2011, 19:06 | #5 |
Пользователь
Регистрация: 19.07.2010
Сообщений: 392
Благодарности: 0
Поблагодарили 76
раз(а) в 76 сообщениях
Обратиться по нику Цитата выделенного |
Код:
execute ibeblock as begin OdbcCon = ibec_CreateConnection(__ctODBC, 'Driver={Microsoft dBASE Driver (*.dbf)};DriverID=277;Dbq=d:\video\gibdd;'); FBCon = ibec_CreateConnection(__ctFirebird, 'DBName=localhost:EX_PROD; Clientlib=d:\WINDOWS\system32\GDS32.DLL;User=SYSDBA; Password=masterke; Names=WIN1251;SQLDialect=1;'); ibec_UseConnection(OdbcCon); --читаем последовательно все записи из dbf for execute statement 'select unicode, num_res, date_res, result, text from otvet.dbf' --указать поля, которые нужно обновить в zapros into :code, :num_res, :date_res, :result, :text --перечислить их здесь в том же порядке do begin ibec_UseConnection(FBCon); update zapros set --а тут их обновить в zapros text = coalesce(text, '') || :text || ', ', --тут конкатенация. coalesce нужен, чтобы убрать null result = :result, date_res = :date_res, num_res = :num_res where pk = :code; --обновляем запись по коду end; commit; ibec_CloseConnection(OdbcCon); ibec_CloseConnection(FBCon); end |
В Минюст Цитата Спасибо |
Опции темы | |
|
|
«Закония» в соц. сетях