Ответить

 

Опции темы
Старый 30.03.2011, 18:06   #1
Sirius34
Пользователь
 
Аватар для Sirius34
 
Регистрация: 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
Sirius34
Пользователь
 
Аватар для Sirius34
 
Регистрация: 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
Sirius34
Пользователь
 
Аватар для Sirius34
 
Регистрация: 19.07.2010
Сообщений: 392
Благодарности: 0
Поблагодарили 76 раз(а) в 76 сообщениях

Обратиться по нику
Цитата выделенного
По умолчанию

загружается, причем великолепно
но проблему я выше уже обозначил: на один запрос в одном файле может поступить несколько ответов (такова уж софтина у гаишников), а в таком случае ПК СП вносит в базу только последний ответ соответствующий коду запроса, остальные же ответы по этому коду игнорируются
т.е., если у гр. Иванова 4 машины, то информация про 4-ую в базу попадет, а про первые 3 - нет
 
В Минюст Цитата Спасибо
Старый 30.03.2011, 23:35   #4
Sirius34
Пользователь
 
Аватар для Sirius34
 
Регистрация: 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
Sirius34
Пользователь
 
Аватар для Sirius34
 
Регистрация: 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
 
В Минюст Цитата Спасибо


Быстрый ответ

Сообщение:
Опции


Ваши права в разделе