Список форумов BOSSForum.RU - Форум. БОСС-Кадровик
Независимый форум, посвященный системе БОСС-Кадровик
и всему, что с ней связано
 FAQFAQ   ПоискПоиск   ПользователиПользователи   ГруппыГруппы   РегистрацияРегистрация 
 ПрофильПрофиль   Войти и проверить личные сообщенияВойти и проверить личные сообщения   ВходВход 

Выгрузка DBF

 
Начать новую тему   Ответить на тему    Список форумов BOSSForum.RU - Форум. БОСС-Кадровик -> X-язык
Предыдущая тема :: Следующая тема  
Автор Сообщение
tveritin



Зарегистрирован: 26.01.2016
Сообщения: 180
Откуда: Санкт-Петербург

СообщениеДобавлено: Чт Мар 09, 2023 17:42    Заголовок сообщения: Выгрузка DBF Ответить с цитатой

О существовании z-процедуры to_dbf я знаю, но она применяется в z-языке.
Какие существуют в БК методы формирования (вставки данных) в DBF-файл.
Из базовых объектов нашел только pr_prc_ReferenceBook_Change_old, но она читает файл, а нужно делать запись.
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Отправить e-mail
superjek



Зарегистрирован: 04.04.2022
Сообщения: 25

СообщениеДобавлено: Пт Мар 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
Сообщения: 180
Откуда: Санкт-Петербург

СообщениеДобавлено: Пт Мар 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};
};

Но, недостаток этого метода в том, что надо принудительно ставить в региональных настройках разделитель точку вместо запятой.
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Отправить e-mail
tveritin



Зарегистрирован: 26.01.2016
Сообщения: 180
Откуда: Санкт-Петербург

СообщениеДобавлено: Пт Мар 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 и вроде как должно привести к той же ошибке. Но нет, всё работает корректно.
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Отправить e-mail
tveritin



Зарегистрирован: 26.01.2016
Сообщения: 180
Откуда: Санкт-Петербург

СообщениеДобавлено: Пт Мар 10, 2023 15:33    Заголовок сообщения: Ответить с цитатой

Код:
Format(SUMMA, '#.##')

исключает проблемы с запятыми и точками
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Отправить e-mail
Показать сообщения:   
Начать новую тему   Ответить на тему    Список форумов BOSSForum.RU - Форум. БОСС-Кадровик -> X-язык Часовой пояс: GMT + 4
Страница 1 из 1

 
Перейти:  
Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах


Pоwerеd by рhpВB © 2001, 2005 рhpВB Grouр
Русская поддержка phрВB
Rambler's Top100 Рейтинг@Mail.ru Список форумов BOSSForum.RU