Независимый форум, посвященный системе БОСС-Кадровик и всему, что с ней связано
|
|
Предыдущая тема :: Следующая тема |
Автор |
Сообщение |
tveritin
Зарегистрирован: 26.01.2016 Сообщения: 181 Откуда: Санкт-Петербург
|
Добавлено: Чт Мар 09, 2023 17:42 Заголовок сообщения: Выгрузка DBF |
|
|
О существовании z-процедуры to_dbf я знаю, но она применяется в z-языке.
Какие существуют в БК методы формирования (вставки данных) в DBF-файл.
Из базовых объектов нашел только pr_prc_ReferenceBook_Change_old, но она читает файл, а нужно делать запись. |
|
Вернуться к началу |
|
|
superjek
Зарегистрирован: 04.04.2022 Сообщения: 28
|
Добавлено: Пт Мар 10, 2023 10:11 Заголовок сообщения: |
|
|
Используем to_dbf из X языка, через оберточную Z функцию zrp_user_dbf, код на Z :
Код: |
{var str1[20], str2[20];
ParamStr(0, str1);
ParamStr(1, str2);
n=to_dbf(str1, 000, str2);
if (n==0) put("Завершено успешно!");
else put("Завершено неудачно!");
return 0;
}
|
Вызов из X, с передачей запроса из временной таблицы
Код: |
udf Z, "zrp_user_dbf", FileName[''],
'select * from #tmp';
|
Другой вариант , использовать VB, код из интернета, для примера, работает в БК, создает dbf файл в заданной директории homeDir:
Код: |
vb
{
homeDir="C:\Test\" '::: Директория, где будет создан DBF
k=Instrrev(homeDir,"\") '::: Ищем "\" с конца
homeDir=left(homeDir,(k-1)) '::: Это - чистое имя директории
'::: Этап 2 - Создаем ADO-соединение и пустой набор записей
Set Conn = CreateObject("ADODB.Connection")
Set RS = CreateObject("ADODB.Recordset")
DSNName = "DRIVER=Microsoft dBase Driver (*.dbf);DBQ="
DSNName = DSNName & HomeDir
'::: Этап 3 - Открываем соединение
Conn.Open DSNName
'::: Этап 4 - готовим SQL-оператор для создания таблицы
SQL="create table Testtable (N1 Float, N2 Float)"
'::: Этап 5 - выполняем его
RS.Open sql,Conn,3,3
'::: Этап 6 - Добавляем в таблицу 100 записей
For i=1 to 100
SQL="insert into testtable values (" & cstr(i) & "," & Cstr(2*i-1) & ")"
RS.Open sql,Conn,3,3
Next
'::: Этап 7 - суммируем...
SQL="Select sum(N1),sum(N2) from Testtable"
RS.Open SQL,Conn,3,3
SS1=RS(0)
SS2=RS(1)
MsgBox SS1
MsgBox SS2
Rs.Close
SQL="Drop table Testtable"
RS.Open sql,Conn,3,3
MsgBox "Таблица удалена!"
};
| [/code] |
|
Вернуться к началу |
|
|
tveritin
Зарегистрирован: 26.01.2016 Сообщения: 181 Откуда: Санкт-Петербург
|
Добавлено: Пт Мар 10, 2023 12:42 Заголовок сообщения: |
|
|
Подстановочную функцию уже кто-то сделал, я этим сегодня воспользовался:
Код: | UDF Z "zrp_user_to_dbf", _FileName[''], #KZ_1C, 0; |
А вот за второй способ спасибо.
У нас в пользовательских объектах немного по-другому ADODB connection использовано:
Код: | vb{
Dim conn, fs
Set conn = CreateObject("ADODB.Connection")
Set fs = CreateObject("Scripting.FileSystemObject")
conn.Open ("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & path & ";Extended Properties=dBASE IV;User ID=Admin")
If (fs.FileExists(path & "KZ_1C.dbf")) Then
conn.Execute "drop table KZ_1C"
End If
};
if _path[''] !== '' then Execute xFile(Unload _path[""],'id = 20',9,"Customize", "hrtb_file");
scan @kz
select
..........
from #SAP_ITOG
order by ...........
Execute {
if .............. then {
vb.(:@kz:....,.......)
{
(.............);
};
vb{
conn.Execute "Insert into KZ_1C (...........) values()"
};
};
}; -- execute
vb{
conn.Close
Set fs = Nothing
Set conn = Nothing};
}; |
Но, недостаток этого метода в том, что надо принудительно ставить в региональных настройках разделитель точку вместо запятой. |
|
Вернуться к началу |
|
|
tveritin
Зарегистрирован: 26.01.2016 Сообщения: 181 Откуда: Санкт-Петербург
|
Добавлено: Пт Мар 10, 2023 14:44 Заголовок сообщения: |
|
|
Дошло до меня почему не работал этот метод.
Вставка в DBF-файл производилась запросом, который формировался строкой:
Код: | conn.Execute "Insert into KZ_1C (MVZ,DAT,PODR,KAT,DT,KT,STZ,[SUM],RAB,KONTRAG,PIT,PREM) values( '" & MVZ_& "','" & DAT_ & "','" & PODR_& "', " & KAT_& ", '" & DEBET_ & "','" & KREDIT_ & "','" & STZ_ & "', " &SUMMA_& ",'" &RAB_& "','" &KONTRAG_& "','" &PIT_& "','" &PREM_&"')"
|
Т.е., если разделитель дробной части точка, то всё корректно
Код: | Insert into KZ_1C (MVZ,DAT,PODR,KAT,DT,KT,STZ,[SUM],RAB,KONTRAG,PIT,PREM)
values( '1','11.11.2022','2', 3, '4','5','6', 1234.56,'7','8','9','10') |
Ну а если разделитель запятая, то сумма 1234.56 превращалась в 1234,56 т.е. в два разных значения. Это и приводило к ошибке.
Добавил преобразование числа в строку с заменой запятой на точку
Код: | replace(convert(varchar,SUMMA),',','.') as SUMMA |
Как ни странно, если поставить в системе запятую как разделитель тысяч и точку как разделитель целой и дробной частей, то число должно приобрести вид 1,234.56 и вроде как должно привести к той же ошибке. Но нет, всё работает корректно. |
|
Вернуться к началу |
|
|
tveritin
Зарегистрирован: 26.01.2016 Сообщения: 181 Откуда: Санкт-Петербург
|
Добавлено: Пт Мар 10, 2023 15:33 Заголовок сообщения: |
|
|
Код: | Format(SUMMA, '#.##') |
исключает проблемы с запятыми и точками |
|
Вернуться к началу |
|
|
|
|
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете голосовать в опросах
|
|