Форум » [x]Harbour » xHarbour и SyBase » Ответить

xHarbour и SyBase

Oskar_AAA: Добрый день, давно не был у нас на форуме. Поставлена задача: выбрать данные из нескольких таблиц Sybase и записать их в DBF файлы. Есть исходный текст макроса на Excel, который выбирает данные, но поменялась структура таблиц, их наименование и взаимосвязи между ними... Описание полей и таблиц Sybase есть. Хотелось бы создать модуль в программе на xHarobour и выбирать из таблиц Sybase данные... С чего начать и Как это сделать ? Спасибо.

Ответов - 53, стр: 1 2 3 All

Dima: Oskar_AAA пишет: выбрать данные из нескольких таблиц Sybase Что это за формат баз ?

Oskar_AAA: Формат таблиц - не знаю... Фрагмент макроса Excel Sub LoadFL() Dim wrkODBC As Workspace Dim conPubs As Connection Dim realst As Recordset Dim restst As Recordset sql_odbc = Info.[D2].Value ' Источник ODBC sql_user = Info.[D3].Value ' Пользователь БД sql_pswd = Info.[D4].Value ' Пароль пользователя БД wb_StartSh = Info.[D6].Value ' Смена начала 'wb_EndSh = Info.[D7].Value ' Смена окончания Real1 = " SELECT " & _ " azsno, " & _ " shiftid, " & _ " (select timepoint from shiftslog where shiftslog.shiftid=shiftrep2.shiftid and shiftslog.azsno=shiftrep2.azsno and state=1), " & _

Haz: Oskar_AAA пишет: Источник ODBC Можно подключиться через ODBC . Я к сожалению с этим механизмом мало работал , можно посмотреть примеры в харбуре ( там есть на примере MSSQL ). Ну или подскажет кто


Haz: Haz пишет: Фрагмент макроса Exce Если коротко, то для решения задачи нужно 1. Правильный ConnectString для Sybase . по примеру этого для MSSQL [pre2] oConnection:Open( "DRIVER={MySQL ODBC 3.51 Driver};" + ; "server=" + cServer + ; ";database=" + cDataBase + ; ";uid=" + cUserName + ; ";pwd=" + cPassword ) oConnection:Execute( "SELECT * FROM " + cTableName ) [/pre2] 2. Правильный SQL запрс ( нужно знать таблицы и поля ) . К примеру SELECT выше 3. Перебрать в цикле весь набор данных ( RecordSet ) типо как тут ( пример был для других целей )) [pre2] for l := 1 to len(oConnection:aRecordSet) for c := 1 to len(oConnection:aRecordSet[l]) do case case valtype(oConnection:aRecordSet[l][c]) == "C" c_TmpContent := alltrim(oConnection:aRecordSet[l][c]) case valtype(oConnection:aRecordSet[l][c]) == "N" c_TmpContent := alltrim(str(oConnection:aRecordSet[l][c])) case valtype(oConnection:aRecordSet[l][c]) == "D" c_TmpContent := alltrim(DtoC(oConnection:aRecordSet[l][c])) case valtype(oConexion:aRecordSet[l][c]) == "L" c_TmpContent := alltrim(oConnection:aRecordSet[l][c]) end case ТУТ ПИШЕМ В DBF next next [/pre2] PS Главное это oConnection получить и раз таблицы и поля есть - то остальное просто ))

Oskar_AAA: HAZ Спасибо, какие библиотеки, Include итд надо подключить.

Haz: Oskar_AAA пишет: какие библиотеки, Include итд надо подключитькажется ADO хватит [pre2] #include "rddsys.ch" #include "adordd.ch" [/pre2] и библиотеки [pre2] adordd hbusrrdd [/pre2] PS connectstring должен где-то в EXCEL макросах прписан. явно или неявно , но быть должен

Oskar_AAA: Haz у меня нет библиотек ADORDD.Lib, HBUSRRDD.Lib RDDSYS.Ch, ADORDD.Ch есть Использую xHarbour Compiler build 1.2.1 (SimpLex) (Rev. 6476)

Haz: Это библиотеки Harbour , уверен в xHarbour есть какие-то аналоги. Подсказать не могу т.к. работаю только с Harbour. Точнее бивлиотеки обнаружил в поставке MiniGui Чисто в Harbour есть SDDODBC ( возможно он же в xHarbour ) пример с драйвером MySQL оттуда [pre2] #require "rddsql" #require "sddodbc" #include "simpleio.ch" REQUEST SQLMIX, SDDODBC PROCEDURE Main() LOCAL nConnection, nI, aI Set( _SET_DATEFORMAT, "yyyy-mm-dd" ) rddSetDefault( "SQLMIX" ) nConnection := rddInfo( RDDI_CONNECT, { "ODBC", "Server=localhost;Driver={MySQL ODBC 5.1 Driver};dsn=;User=test;database=test;" } ) IF nConnection == 0 ? "Unable connect to server", rddInfo( RDDI_ERRORNO ), rddInfo( RDDI_ERROR ) RETURN ENDIF ? nConnection ? rddInfo( RDDI_EXECUTE, "DROP TABLE country" ) ? rddInfo( RDDI_EXECUTE, "CREATE TABLE country (CODE char(3), NAME char(50), RESIDENTS int(11))" ) ? rddInfo( RDDI_EXECUTE, "INSERT INTO country values ('LTU', 'Lithuania', 3369600),('USA', 'United States of America', 305397000), ('POR', 'Portugal', 10617600), ('POL', 'Poland', 38115967), ('AUS', 'Australia', 21446187), ('FRA', 'France', 64473140), ('RUS', 'Russia', 141900000)" ) ? dbUseArea( .T., , "SELECT * FROM country", "country" ) ? "LASTREC:", LastRec() DO WHILE ! Eof() aI := Array( FCount() ) FOR nI := 1 TO FCount() aI[nI] := FieldGet( nI ) NEXT ? RecNo(), hb_ValToExp( aI ) dbSkip() ENDDO ? "LASTREC:", LastRec() dbCloseAll() RETURN [/pre2] ЗЫ. Примеров много,но с SyBase нет и по прежнему главное - получить коннект

Oskar_AAA: скачал ADORDD.zip 2007 года в архиве есть библиотеки и примеры. http://www.fivetechsoft.com/files/adordd.zip будем пробовать... Спасибо, друзья

Oskar_AAA: HAZ Доброе утро, скомпилировал MYSQL3.prg из архива ADORDD.Zip вылетает при запуске по ошибке Module: 'adordd.prg' was compiled into PCODE version: 9,this version of xHarbour expects version: 10Module: 'adordd.prg' was compiled into PCODE version: 9,this version of xHarbour expects version: 10

Haz: Oskar_AAA пишет: скомпилировал MYSQL3.prg из архива ADORDD.Zip вылетает при запуске по ошибке Посмотри в примерах xHarbour , уверен там есть не одно использование ODBC Или велкам в Harbour , в нем с десяток различных примеров наберется точно PS можешь попробовать еще ADORDD из поставки MiniGui , может он соберется . в скачанном тобой архиве версия от 2007/05/12 в Minigui - 2008/07/08

Andrey: Oskar_AAA пишет: Module: 'adordd.prg' was compiled into PCODE version: 9,t Такую ошибку встречал при компиляции новым компилятором при старых obj скомпилированным старым компилятором. Попробуй удалить все obj и сделать повторную компиляцию.

Dima: Andrey пишет: Попробуй удалить все obj и сделать повторную компиляцию +1

Oskar_AAA: Добрый вечер, коллеги. Тоже думал про повторную компиляцию. Но не помню как ее делать.... Obj файлы - где? Нашел в своей сборке ADORDD.prg от 11.06.2009. Obj и С файлы из своих PRG удаляются при каждой сборке EXE модуля...

azoo: Учитывая что в Harbour нет норм. драйвера для Sybase, может проще будет написать программу по выгрузке из Sybase в CSV (или SDF ?) на Delphi например, а потом получившийся текстовый файл выгрузить в DBF средствами Harbour или Clipper.

Oskar_AAA: Добрый вечер, из SYBASE я выгружаю в DBF, но пока приходится набирать запросы по таблицам. Написанием программы в Sybase опыта нет. Но требуется : ввести номер смены, выборка из 4 таблиц записей по заданному номеру смены в 4 файла DBF вот и все.. а далее уже xHarbour

Andrey: azoo пишет: может проще будет написать программу по выгрузке из Sybase в CSV (или SDF ?) на Delphi например, Из вики: Возможно использование ряда драйверов базы данных таких языков программирования как Java, C/C++m, PHP, PERL, Python, Ruby, ADO.Net. Делай выгрузку на любом языке...

Oskar_AAA: Добрый день, необходимо перевести из UTF8 в RU866 База DBF уже создана из SYBASE посредством выбора данных по условию и экспортирована в формате DBF. Программа xHarbour Compiler build 1.2.1 (SimpLex) (Rev. 6476) Copyright 1999-2009, http://www.xharbour.org http://www.harbour-project.org/ фрагмент кода REQUEST HB_CODEPAGE_RU866 REQUEST DBFCDX,DBFFPT HB_SetCodePage( "RU866" ) RDDSetDefault('DBFCDX') Use UTF8 Alias UTF Exclusive NEW DbGoTop() Do While Eof() Repl Name_866 With HB_UTF8TOSTR(Name,"RU866") DbSkip() Enddo Поле Name_866 получается пустым ? Добрый день, необходимо перевести из UTF8 в RU866 База DBF уже создана из SYBASE посредством выбора данных по условию и экспортирована в формате DBF. Программа xHarbour Compiler build 1.2.1 (SimpLex) (Rev. 6476) Copyright 1999-2009, http://www.xharbour.org http://www.harbour-project.org/ фрагмент кода REQUEST HB_CODEPAGE_RU866 REQUEST DBFCDX,DBFFPT HB_SetCodePage( "RU866" ) RDDSetDefault('DBFCDX') Use UTF8 Alias UTF Exclusive NEW DbGoTop() Do While Eof() Repl Name_866 With HB_UTF8TOSTR(Name,"RU866") DbSkip() Enddo Поле Name_866 получается пустым ?

Oskar_AAA: Dim Если ставить REQUEST HB_CODEPAGE_UTF8EX Error: Unresolved external '_HB_FUN_HB_CODEPAGE_UTF8EX'

Dima: Oskar_AAA пишет: Error: Unresolved external '_HB_FUN_HB_CODEPAGE_UTF8EX' Harbour ?

Oskar_AAA: xHarbour Compiler build 1.2.1 (SimpLex) (Rev. 6476)

Haz: Oskar_AAA пишет: База DBF уже создана из SYBASE посредством выбора данных по условию и экспортирована в формате DBF. П База в харбуре нормально открывается и читабельна ?

Oskar_AAA: HAZ, спасибо за внимание. База создана из SYBASE и спокойно читается в xHarbour, проблема только с символьными полями В SYBASE есть возможность экспорта результата выборки в различные форматы (Xls, Txt. Dbf...) при экспорте в Xls символьные поля тоже с "кракозябрами".... формат XLS не подходит по причине ограничения на 65535 строк.

Haz: Oskar_AAA пишет: проблема только с символьными полями Если при текстовом просмотре и выборе UTF содержимое видно правильно, то перекодировку можно написать на Fopen() - FWrite() Формат DBF известен , читаем блоками и пишем туда же

Haz: Oskar_AAA пишет: (Xls, Txt. Dbf...) Текстовой кстати легче преобразовать будет. Тхт - кстати открывается Excel без крякозябров , а в последних версиях Excel нет ограничения на 64К срок

SergKis: Oskar_AAA попробуйте посмотреть dbf в harbour (можно взять от MiniGui, если нет hb 3.2 у вас) REQUEST HB_CODEPAGE_UTF8EX HB_SetCodePage( "UTF8EX" ) RDDSetDefault('DBFCDX') Use UTF8 Alias UTF Exclusive NEW browse() или HB_SetCodePage( "RU866" ) USE UTF8 ALIAS INP VIA 'DBFCDX' NEW CODEPAGE 'UTF8EX' browse() что то похожее пробовал давно с dbf в utf8 кодировке, но только средствами hb - получалось ok

Oskar_AAA: Друзья, все таки нужен DBF, с ним потом нужно работать... Почему не работает функция Hb_Utf8ToStr(Name,"RU866")???

Dima: Oskar_AAA пишет: Почему не работает функция Hb_Utf8ToStr(Name,"RU866")??? возможно ей нужен вызов REQUEST HB_CODEPAGE_UTF8EX , в Xharbour 1.2.3 ни чего такого не нашел (может искал плохо). Если это разовая операция я бы двигался в сторону которую предложил SergKis

SergKis: Oskar_AAA пишет:Почему не работает функция Hb_Utf8ToStr(Name,"RU866") Вы уверены, что в поле данные в utf8 ?

Haz: Oskar_AAA пишет: Почему не работает функция Hb_Utf8ToStr(Name,"RU866")??? попробуй hb_Translate( cStr, "UTF8", "RU1251" ), использовал ее когда то

Oskar_AAA: SergKis при *REQUEST HB_CODEPAGE_UTF8EX Error: Unresolved external '_HB_FUN_HB_CODEPAGE_UTF8EX' такой код проходит, HB_CDPSelect("UTF8") HB_SetCodePage( "RU866" ) USE UTF8 ALIAS INP VIA 'DBFCDX' NEW CODEPAGE 'UTF8EX' browse() Но, результат - крякозябры

SergKis: Oskar_AAA возможно надо USE UTF8 ALIAS INP VIA 'DBFCDX' NEW CODEPAGE 'UTF8' xHb в руках не держал и в нем не разбираюсь но возможно перекодировку dbf из SyBase сделать на hb (режим export\import присутсвует по любому), а работать с dbf 866 xHb

Oskar_AAA: попробовал - тоже самое... Есть алгоритм пересчета кодов UTF8 в RU866 ? /может написать самому блок кода по пересчету кодов старше 127.../

Oskar_AAA: Haz попробуй hb_Translate( cStr, "UTF8", "RU1251" ), использовал ее когда то не прошло, крякозябры... может что-то надо подключить из LIB, CH? # Include 'Achoice.Ch' # Include 'Inkey.Ch' # Include 'Directry.Ch' # Include 'Setcurs.Ch' # Include 'Dbstruct.Ch' # Include 'Command.Ch' # Include 'Dbedit.Ch' # Include 'Excel.Ch' # Include 'Hbgtinfo.Ch'

Dima: Oskar_AAA Какую кодировку показывает Dbedit из темы ? http://clipper.borda.ru/?1-4-0-00001125-000-0-0-1463462933

Oskar_AAA: Dima, DBEDIT из темы нет... но при выгрузке из SYBASE в TXT файл, FAR правильно показывает в OEM кодировке, в ANSI крякозябры...

Oskar_AAA: DIMA. скачал DBEDIT - показывает верно (F3)!!! Что делать дальше,,,?

Oskar_AAA: Кодировка 1251 - ОК, 866 - крякозябры

Dima: я уже что то совсем потерялся в плане чего нужно сделать если честно все смешалось в кучу RU866 , UTF8 , CP1251. какова исходная задача то ?

Haz: Oskar_AAA пишет: Кодировка 1251 - ОК и причем тут UTF ?

Oskar_AAA: Dima, извиняюсь... Выгружаю из SYBASE записи в формате DBF, символьные поля в UTF8. Открываю файл в xHarbour символьные поля не читаются (крякозябры). Требуется при открытии файла DBF перевести символьные поля в нормальную кодировку (RU866). Попробовал открыть файл DBEDIT'-ом из темы и выбрать кодировку 1251 все нормально, скопировал файл DBEDIT'-ом в другой файл а затем открыл в DBU.exe - символьные поля в нормальной кодировке...

Dima: Oskar_AAA пишет: Выгружаю из SYBASE записи в формате DBF, символьные поля в UTF8. Вот теперь этот DBF открой с помощью DBEDIT , в левом нижнем углу будет написана кодировка в файле. По ходу там же можно перекодировать файл в меню Поиск - Транслировать

Dima: Dima пишет: Вот теперь этот DBF открой с помощью DBEDIT , в левом нижнем углу будет написана кодировка в файле. упс я не прав , думал там автодетект

Haz: Dima пишет: По ходу там Дима , по ходу там DBF в 1251 из SyBase выгружается и при попытке его прочесть в UTF имеем то что имеем )

Dima: Haz пишет: Дима , по ходу там DBF в 1251 из SyBase выгружается Oskar_AAA пишет: Выгружаю из SYBASE записи в формате DBF, символьные поля в UTF8 Кхм Игорь а где правда ?

Haz: Dima пишет: а где правда где то тут Попробовал открыть файл DBEDIT'-ом из темы и выбрать кодировку 1251 все нормально,

Oskar_AAA: Открываю файл, в нижней строке RU866. Shift+F3 выбираем RU1251 и все нормально, далее копирую записи в другой файл и открываю его в DBU - символьные поля в норме...

Dima: Haz пишет: где то тут Тогда достаточно Hb_ansitoem() Вопрос вроде решен.....

Dima: Хорошо хоть изначально была ошибочно UTF8 а не UCS-2 LE BOM

Oskar_AAA: Dima, Haz,SerKis Спасибо, HB_AnsiToOem( ) и все ОК, кураторы блока по SYBASE известили нас о кодировке UTF8. Вот и ковырялся и Вас замучил...

Haz: Oskar_AAA пишет: и все ОК, кураторы блока по SYBASE известили нас о кодировке UTF8. Вот и ковырялся и Вас замучил...

Dima: Haz Что то я потерялся в истории SuccessWare , Extended System , Sybase и Sap..... Напомни в 2-х словах ( или больше ) , кого и когда "сожрал" Sap.

Haz: Dima пишет: кого и когда "сожрал" Sap. Всех прожратых не отслеживал а вот что пишут про ADS ============================================================== Advantage Database Server is a relational database management system (RDBMS) for small to medium-sized businesses by SAP SE (formerly Sybase iAnywhere, formerly Extended Systems). ============================================================== https://en.wikipedia.org/wiki/Advantage_Database_Server по этой же ссылке вся история пожирания ADS. Последняя выпущенная версия ADS - версия 12 и уже SAP. Изменен порядок дистрибуции и скачать даже демку стало сложнее. Нет больше девелоперской версии с ключем на 2 юзера. Невозможно больнше отдельно скачать бесплатный ARC32/64, ADSLOCAL итд Все апгрейды доступны только официальным партнерам SAP ( не понятно как знакомиться с новым функционалом нам - обычным людям ). Вобщем тенденция не радует. Что то мне подсказывает что версии 13 не будет, или будет очень не скоро



полная версия страницы