|
|
#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 ====== Буду благодарен за любую помощь, т.к. очень похоже, что это указание будет теперь долго действовать. |
| В Минюст Цитата Спасибо |
|
|
#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 |
| В Минюст Цитата Спасибо |
|
|
#3 |
|
Пользователь
![]() Регистрация: 19.07.2010
Сообщений: 392
Благодарности: 0
Поблагодарили 76
раз(а) в 76 сообщениях
Обратиться по нику Цитата выделенного |
загружается, причем великолепно
но проблему я выше уже обозначил: на один запрос в одном файле может поступить несколько ответов (такова уж софтина у гаишников), а в таком случае ПК СП вносит в базу только последний ответ соответствующий коду запроса, остальные же ответы по этому коду игнорируются т.е., если у гр. Иванова 4 машины, то информация про 4-ую в базу попадет, а про первые 3 - нет |
| В Минюст Цитата Спасибо |
|
|
#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 |
| В Минюст Цитата Спасибо |
|
|
#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
|
| В Минюст Цитата Спасибо |
|
|



«Закония» в соц. сетях