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
Сопутствующие параметры:
штрихкод - количество
страна - классификатор
размер - шкала
Специалист отдела сопровождения и внедрения ЗАО "НПФ Датакрат-С"