Импорт из Excel

Вопросы, не вошедшие в предыдущие разделы

Модератор: nk_dk

Импорт из Excel

Сообщение vic 19 мар 2010, 13:52

очень удобная штука этот импорт из екселя, хочется его применять более широко, т.е. иметь возможность закидывать побольше справочников
в хелпе нашёл такую замечательную фразу 'При необходимости возможно определение собственной вкладки ...'
имея необходимость попытался убедиться в наличии возможности
пришел к выводу что всё замечательно, только когда всё настроено,
а вот чтобы настроить самостоятельно ..., наверное надо иметь кучу опыта такой настройки, а где её взять-то?
... или я чего-то недопонимаю или в хелпе недостаточно информации
например что за поля в таблице IMPORTEXCEL_FIELDS
PARAM_TYPE
PARAM_VALUE
PARAM_PARAMS
IS_ADD

я пытался делать по подобию уже существующих вкладок методом научного тыка,
моя новая вкладка появляется и даже импорт запускается и что-то делает, только ничего не импортится
очевидно что что-то не так а вот как понять что именно?
почему нет вывода ошибок или лога какого ... или я недостаточно внимательно прочитал руководства?
vic
 
Сообщения: 11
Зарегистрирован: 21 апр 2009, 13:21

Re: Импорт из Excel

Сообщение Hash 29 мар 2010, 10:13

Ведение логов включается параметром Trace в default.prj
При включенном параметре часть логов записывается в пользовательский каталог, а часть доступна из интерфейса "Окна" - "Просмотр событий".

По поводу настройки вкладок импорта:

ввод значения руками (работа в окне Импорт из Excel)

ссылка на столбец записывается в [] (например [E] - 5-ый, или [AC] - 29-ый)
символы '[' и ']' записываются как '[[]' и '[]]'

при обработке результата пробелы по краям обрезаются

[?] - если вычисленное значение - пусто, то пропустить строку

[#] - если новое значение пустое, то использовать старое (от предыдущей строчки)

[!<разделитель>] - поле, для которого результат может содержать несколько значений
перечисленных через <разделитель> (для полей классификатора не обрабатывается)
может использоваться не более чем для одного поля
(срабатывает только для первого неклассификаторного поля, все лишние игнорируются)
при разделении строки результата на части - пустые части игнорируются
<разделитель> может содержать более одного символа, включая пробелы
([!] - такой модификатор проигнорируется т.к. <разделитель> не задан)
например если <разделитель> = ',' (т.е. [!,])
то строка '"Stri,ng 1", , "Stri""ng 2" ,'
разобъётся на 3 части:
1 - '"Stri', 2 - 'ng 1"', 3 - '"Stri""ng 2"'
но если строка не содержит ни одной не пустой части, то она всёравно отработается один
раз с пустым значением


модификаторы [#],[?],[!] относятся к полю вцелом
не важно в каком из столбцов 'Значение' или 'По умолчанию' стоит этот модификатор
(хоть сразу в обоих, и по пять раз)

при вводе руками можно использовать специальные обозначения
автогенерация:
[AUTO_ID] - GET_ID(<table_name>)
[AUTO_ARTICUL] - DKGetLastArticul('')
текущие параметры:
[CUR_SHOPINDEX]
[CUR_FILIALINDEX]
[CUR_USER]
[CUR_USER_NAME]
[CUR_PRICE_SALE]
[CUR_PRICE_REMAINS]
[CUR_PRICE_MAXREMAINS]
[CUR_PRICE_MAXIN]
[CUR_PRICE_LASTIN]
[CUR_PRICE_NLASTIN]


---------------------------------------------------------------------------------------
есть одно специальное слово которое можно размещать в ячеках Excel-я
'NO VALUE (NEED DEFAULT VALUE)'
при обработке
значение из такой ячейки первоначально не будет признано пустым
(и если для поля используется модификатор [#],
то старое значение (от предыдущей строчки) не будет использовано)
но затем это значение будет обязательно заменено значением по умолчанию
---------------------------------------------------------------------------------------

Настройки импорта

Импорт новых данных или импорт данных в новом формате
настраивается путём добавления/редактирования записей в таблицы с префиксом IMPORTEXCEL_
(т.е. это может сделать любой достаточно грамотный и\или заинтересованный специалист)


описание вкладок в IMPORTEXCEL_KIND
Name - Caption для вкладки
Table_Name - заполняемая таблица
Type_Classif и Classif - параметры классификатора для этой таблицы (если он есть)
Macros - текст макроса (который можно выполнить непосредственно перед импортом)
Run_Macros - флаг надоли выполнять макрос

описание по вкладкам полей и их форматов в IMPORTEXCEL_FIELDS
(тут же сохраняются данные вводимые пользователем в окне Импорт из Excel)
Kind - id вкладки
Pos_Number - порядковый номер поля для отображения на вкладке
FieldName - поле в таблице
Name - Наименование поля для отображения на вкладке
Is_Use - Флаг обрабатывать ли поле при импорте (из программы устанавливается при выборе полей)
Is_Use_Config - Наименование параметра конфигуратора, который определяет используется ли это поле в базе
т.е. если SMConfig.BoolValue[<параметр>]=false то поле не будет отображаться ни на вкладке ни в выборе полей
и обрабатываться при импорте не будет
Is_Required - Флаг что поле обзательно для ввода поэтому его нельзя убрать со вкладки используя выбор полей
Is_Required_Config - Наименование параметра конфигуратора, который определяет является ли поле обзательным для ввода
т.е. если SMConfig.BoolValue[<параметр>]=false то поле не является обзательным для ввода
и его можно убрать со вкладки используя выбор полей
Enter_Type - определяет как задаются значения По умолчанию (дальше подробней)
Enter_Params - дополнительная информация нужна если Enter_Type=1 (дальше подробней)
Enter_Value - значение вводимое пользователем в колонку Значение
Default_Value - значение вводимое пользователем в колонку По умолчанию
Type_Value - тип поля (0 - строка; 1 - целое; 2 - дробное; в остальных случаях в поле заносится null)
Length_Value - длина строки для поля типа строка
для интегерного поля с Enter_Type=1 (т.е. для комбобоксного)
хотя в поле ставится значение из CBSQL Id тут желательно ставить длину поля Name
а для полей автоматически добавляемых простых справочников - обязательно
Need_Column - битовые флаги дополнительно описывающие поле (дальше подробней)
Column_Id - ссылка на столбец, в который при импорте будет сохраняться расчитаное значение (при включенном Need_Column[2] обязательна)

поля для сопутсвующего параметра
Param_Type - тип определяет как значение использовать в запросах и каким образом его вводить/выбирать (дальше подробней)
Param_Value - значение введённое/выбраное пользователем
Param_Params - дополнительные параметры необходимые чтобы организовать пользователю выбор значения для сопутсвующего параметра (дальше подробней)


Enter_Type
-1 - поле не отображается ни на вкладке ни в выборе полей, но при импорте используется (Is_Use и Is_Required должны быть =1)
0 - ввод значения руками
1 - ввод значения выбором из комбобокса, который строится по запросу CBSQL
2 - ввод значения выбором из фиксированного комбобокса со значениями 'T','F' (для T_BOOLEAN)
3 - ввод значения выбором из фиксированного комбобокса со значениями '1','0','-1' (для T_INT_BOOLEAN)


Enter_Params
CBSQL - возможные значения для комбобокса (если Enter_Type=1) (должен возвращать поля id,name)
CBSQL выполняется в транзакции только на чтение
VSQL - проверка значения можно ли его использовать (например при вводе цен ARTICUL должен существовать) (если Enter_Type=0)
если результат запроса не пустой, то значение можно использовать
VSQL выполняется позже чем ASQL и в транзакции только на чтение
SSQL - селект для внешних полей (чтобы проверить есть или нет такая запись, чтобы знать что использовать - вставку или апдейт)
ISQL - вставка для внешних полей (если результат запроса SSQL пустой)
USQL - апдейт для внешних полей (если результат запроса SSQL не пустой)
ASQL - как и ISQL это тоже вставка, но в простой справочник (если выставленн бит Need_Column[5])
считается что, предварительной проверкой на то, что запись ещё не существует, является CBSQL
ASQL выполняется раньше чем VSQL

все эти запросы выпоняются в транзакции на запись
но CBSQL, VSQL, ASQL если выполнились без ошибок комитятся всегда
т.е. их выполнение не относится к импорту очередной строки
а вот импорт в основную таблицу и выполнение запросов SSQL, ISQL, USQL по заполнению внешних полей
для каждой Excel строки выполняются в одной и той же тразакции которая комитится только если все они прошли без ошибок
иначе импорт отменяется т.е. транзакция ролбэкается

в текстах запросов VSQL, SSQL, ISQL, USQL допустимо использовать конструкции - [имя поля] или [<имя поля>]
где 'имя поля' это значение из FIELDNAME (в рамках текущего KIND-а)
- конструкция [имя поля] заменится на текущее значение указанного поля
- конструкция [<имя поля>] заменится на текущее значение сопутствующего парамера для указанного поля
в отношении ASQL и VSQL надо помнить, что запись с текущими значениями во
время проверки/вставки (т.е. когда он используется) ещё не создана,
а когда используются SSQL, ISQL, USQL основная запись уже создана/или изменена

ВНИМАНИЕ в текстах запросов нельзя использовать специальные обозначения атогенерации
[AUTO_ID] - GET_ID(<table_name>)
[AUTO_ARTICUL] - DKGetLastArticul('')
но можно использовать специальные обозначения текущих параметров
[CUR_SHOPINDEX]
[CUR_FILIALINDEX]
[CUR_USER]
[CUR_USER_NAME]
[CUR_PRICE_SALE]
{ спец-прайсы теперь нельзя использовать (т.к. они должны меняться только автоматически при оприходовании документов)
[CUR_PRICE_REMAINS]
[CUR_PRICE_MAXREMAINS]
[CUR_PRICE_MAXIN]
[CUR_PRICE_LASTIN]
[CUR_PRICE_NLASTIN]
}


ВНИМАНИЕ для комбобоксных полей (если Enter_Type=1) вместо [<имя поля>]
подставляются значения возвращаемые запросом CBSQL (id,name)
всегда подставляется id согласно Type_Value и Length_Value
за одним исключением:
только для ASQL и только если <имя поля> указывает на поле, справочник которого и должен пополниться (в результате выполнения ASQL)
подставляется - name (как строка макс. длиной Length_Value)


Need_Column
значения битов для NEED_COLUMN
1 (1) - поле ключевое
2 (2) - ссылка на столбец для сохранения обязательна
3 (4) - поле классификатора (должно быть только одно)
4 (8) - внешнее поле (например для карточек при создании обязательно нужны налоги, поэтому добавлены внешние поля TAXKIND0 и TAXKIND1)
внешние поля заплняются после создания/обновления основной записи
5 (16)- поле ссылка на простой справочник с возможностью автоматического заполнения (справочника)
6 (32)- используется сопутствующий параметр


Param_Type -
0 - строка (максимальная длина берётся из Param_Params.LENGTH)
1 - целое число
2 - дробное число
3 - целое - id из списка (CBSQL id,name)
4 - целое - группа из классификатора (TYPE_CLASSIF)
в остальных случаях ставится null

Param_Params -
CBSQL - как и в Enter_Params (если Param_Type=5)
CAPTION - заголовок для окна ввода
TYPE_CLASSIF - тип классификатора для выбора группы (если Param_Type=4)
LENGTH - максимальная длина строкового значения (если Param_Type=0)


вычисление значения для поля
1. вычисляются две строки по столбцам 'Значение' и 'По умолчанию'
2. если первая строка пустая, но для поля использовался модификатор [#],
то ей присваивается вычисленное значение от предыдущей записи
3. если первая строка = 'NO VALUE (NEED DEFAULT VALUE)',
то она очищается
4. если первая строка пустая, то ей присваивается значение второй строки
5. вычисленное значение = первая строка

-----------------------
Простые справочники с возможностью автоматического заполнения

для полей у которых значения По умолчанию задаются выбором из списка (который строится по запросу CBSQL)
т.е. с Enter_Type=1
при импорте очередной строки вычисленное значение считается Наименованием
а в базу заносится id который определяется по списку
тут используется столбец с чекбоксами - Создавать запись
если в списке не найдено строки с вычисленным значением то возможны 2 варианта:
1) если включен флаг Создавать запись,
то в справочник автоматически будет добавлена новая запись (точнее будет выполнена попытка добавить),
справочник обновится,
и будет выполнена повторная попытка определить id
(если и после этого в списке не найдено строки с вычисленным значением то дальше будет действовать вариант 2)
2) если не включен флаг Создавать запись
(или включен, но после выполнения варианта 1 id всёже не удалось определить),
то вычисленное значение заменяется на нулевое (т.е. на Null)
далее как обычно (в частности, если для поля используется модификатор [?], то строка пропускается)



алгоритм автоматического добавления
выполняем запрос ASQL


-----------------------

По формату MEX

Sub Mex_fmt_Add_01()
'
' Mex_fmt_Add_01 Макрос
' Макрос записан 05.06.2008 (Victor)
'

Dim v_str As String
Dim v_s As String
Dim v_row As Integer
Dim articul_col As Integer

articul_col = 13 ' это типа константа - номер пустого столбца для занесения в него спец. значения "NO VALUE (NEED DEFAULT VALUE)"
v_row = 1 ' считается что первая строка содержит заголовки столбцов (будет пропущена)
v_str = ""

While v_str = "" ' начиная со второй строки ищем первую у которой не пуста ячейка с артикулом производителя
v_row = v_row + 1
v_str = Cells(v_row, 2).Text
Wend

' теперь для каждой строки с новым артикулом производителя будем ставить спец. значение
Cells(v_row, articul_col).Value = "NO VALUE (NEED DEFAULT VALUE)"
While v_str <> ""
v_row = v_row + 1
v_s = Cells(v_row, 2).Text

If v_s = "" Then ' если попалась строка с пустой ячейкой Артикул то считаем строку пустой
v_str = "" ' и прекращаем обработку строк
ElseIf v_s = v_str Then
Cells(v_row, articul_col).Value = ""
Else
v_str = v_s
Cells(v_row, articul_col).Value = "NO VALUE (NEED DEFAULT VALUE)"
End If
Wend

End Sub


Сопутствующие параметры:
штрихкод - количество
страна - классификатор
размер - шкала
Специалист отдела сопровождения и внедрения ЗАО "НПФ Датакрат-С"
Hash
Модератор
 
Сообщения: 30
Зарегистрирован: 10 мар 2010, 17:19

Re: Импорт из Excel

Сообщение vic 15 апр 2010, 15:16

большое спасибо за информацию
... хоть и переварить её удалось далеко не сразу

очень помогло в понимании 'что когда как ... и зачем'
когда я все используемые запросы
типа
select field1,field2 from table
update table set field1=value1 where field2=value2
переделал в запросы через процедуры,
а внутри этих процедур поставил трэйсы

типа
процедура для селекта:
create procedure sel_table returns(field1 integer, field2 integer)
declare variable v_msg varchar(255);
as begin
execute procedure trace('sel_table');
for select field1,field2 from table into :field1,:field2
do begin
v_msg='field1='||field1||', field2='||field2;
execute procedure trace(:v_msg);
suspend;
end
end
а сам селект
select field1,field2 from sel_table

процедура для апдейта:
create procedure upd_table(value1 integer, value2 integer)
declare variable v_msg varchar(255);
as begin
v_msg='upd_table(value1='||value1||', value2='||value2||')';
execute procedure trace(:v_msg);
update table set field1=value1 where field2=value2;
end
а сам апдейт
execute procedure upd_table(value1,value2)

разбирался с этими трэйсами и вашей инфой я довольно долго но оно того стоило ...
теперь можно сказать что так необходимую мне кучу опыта настройки импорта я добыл
vic
 
Сообщения: 11
Зарегистрирован: 21 апр 2009, 13:21

Re: Импорт из Excel

Сообщение vic 15 апр 2010, 15:27

а то что бывает
что сообщения об ошибках выводятся в Журнале событий
я даже знал ... давно ... но забыл
пока вы не подсказали
... но лучше бы было чтобы это подсказывал хелп ... это же его прямая обязаность
vic
 
Сообщения: 11
Зарегистрирован: 21 апр 2009, 13:21


Вернуться в Другие вопросы

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1

cron