18 октября, четверг 07:38
Bankir.Ru

Объявление

Свернуть
Пока нет объявлений.

Первасив и Дельфи7

Свернуть
X
  • Фильтр
  • Время
  • Показать
Очистить всё
новые сообщения

  • Первасив и Дельфи7

    Добрый вечер!
    Посоветуйте пожалуйста как работать с Первасивом в Дельфи7.
    Есть ли компоненты доступа к базам Первасива?

  • #2
    2 ak4:
    ODBC прекрасно позволит Вам работать с базами Pervasive SQL.
    Этот вариант чем-то не устраивает или простые пути ищем в последнюю очередь?

    Комментарий


    • #3
      Cost а можно небольшой примерчик?: -)

      Комментарий


      • #4
        В win98 ODBC кажется нету поддержки Pervasive SQL.

        Комментарий


        • #5
          ak4 В win98 ODBC кажется нету поддержки Pervasive SQL.
          Это так. Но с дистрибутивом Pervasive должны поставляться драйвера для ODBC
          В каждой программе есть по крайней мере одна ошибка

          Комментарий


          • #6
            у кого есть примерчик работы с Первасивом? : -)

            Комментарий


            • #7
              ak4 у кого есть примерчик
              Примерчик чего? Использования TQuery? Смотрите в хелпах Тут главное ODBC настроить. Так это вам первасивовский мануал нужен.
              В каждой программе есть по крайней мере одна ошибка

              Комментарий


              • #8
                ak4, ты по человечьи задачку обрисуй.
                У нас есть несколько решений (начиная от создания документов в RS-Bank, заканчивая отчетами Exсel, который сам лезит в базы, без кодинга на Delphi). Отправлять все - значит запутать тебя в ненужных деталях. Уважаемый Big_Mike абсолютно прав, при установке клиента Pervasive (впрочем, как и сервера) необходимые драйвера будут установлены, хотя на 98-ых корректность их работы не проверяли.
                В общих чертах:

                RS_ADOConnect.Connected:=False;
                RS_ADOConnect.ConnectionString:='Provider=MSDASQL.1;Password=ХХХ;Persist Security Info=True;User ID=ХХХ;Data Source=ХХХ';
                RS_ADOConnect.Connected:=True;
                cRS_Query.SQL.Clear;
                cRS_Query.SQL.Add(mySQL);
                m:=cRS_Query.ExecSQL;
                cRS_Query.Active:=False;

                вместо ХХХ соответственно – пароль, юзер (виндовые), алиас ODBC.
                Подводные камни:
                1. кодировка
                2. видимость таблиц словаря
                3. если RS до 5.00.090, то тип LDMoney
                Skit

                Комментарий


                • #9
                  2 Skit:
                  Подводные камни:
                  2. видимость таблиц словаря
                  3. если RS до 5.00.090, то тип LDMoney

                  А почему сразу RS-Bank? На Pervasiv/Betrive немало АБС работают. Вон хоть тот же старенький Daisoft...

                  Комментарий


                  • #10
                    Skit Хочу ввести проводки в приложении сделанном в Делпи...У нас РСбанк 5.00.086.22..
                    Чтоб они появилис в "отложенных" : -)

                    Комментарий


                    • #11
                      Мы пользуемся компонентами Titan Btrieve (www.reggatta.com). Претензий нет.

                      Комментарий


                      • #12
                        yurak а есть крякнутая версия Titan Btrieve ? :- )

                        Комментарий


                        • #13
                          Cost, ИМХО, там где он работает таких вопросов уже не задают.
                          Skit

                          Комментарий


                          • #14
                            Ну тогда держи более полный код:
                            Код:
                                function tRSPostDoc.mPost (var Doc:tRSPostDoc):byte;   // Сохранение документа в отложенных
                               var
                                  mySQL   : string; // Строка SQL запроса
                                  m       : integer;
                            
                               begin
                                // Проверяем документ перед загрузкой
                                 mCheck(Doc);
                            
                                // Формируем SQL запрос
                                 m:=0;
                                 if Doc.aValOper=true Then mySQL:='insert into postdoc$_dbt' else mySQL:='insert into postdoc_dbt';
                                 mySQL:=mySQL+' (Date_Document,Date_Value,Account_Receiver,Real_Receiver,Payment,SymbNotBal,Symbol_Cach,Kind_Oper,Kind_Carry,Code_Currency,Number_Pack,Ground,Sum_l,Sum_h,Sum_p,Numb_Document,Account_Payer,Real_Payer,Oper,UserField2,UserField3,Shifr_Oper,SEP_Shield)';
                                 mySQL:=mySQL+'';
                                 mySQL:=mySQL+' VALUES ';
                                 mySQL:=mySQL+'('''+DOC.aDate_Document+''','''+DOC.aDate_Value+''','''+DOC.aAccount_Receiver+''','''+DOC.aReal_Receiver+''','+DOC.aPayment+','''+DOC.aSymbNotBal+''','''+Doc.aSymbol_Cach+''','''+Doc.aKind_Oper+''','+Doc.aKind_Carry+','+DOC.aCode_Currency+','+Doc.aNumber_Pack+','''+Doc.aGround+''','+Doc.aSum_l+','+Doc.aSum_h+','+Doc.aSum_p+','''+DOC.aNumb_Document+''','''+DOC.aAccount_Payer+''','''+DOC.aReal_Payer+''','+DOC.aOper+','''+DOC.aUserField2+''','''+DOC.aUserField3+''','''+DOC.aShifr_Oper+''','''+DOC.aSEP_Shield+''')';
                                 mySQL:=mySQL+'';
                                // Выполняем запрос
                                 RS_ADOConnect.Connected:=False;
                                 RS_ADOConnect.ConnectionString:='Provider=MSDASQL.1;Password=ХХХ;Persist Security Info=True;User ID=ХХХ;Data Source=ХХХ';
                                 RS_ADOConnect.Connected:=True;
                                 cRS_Query.SQL.Clear;
                                 cRS_Query.SQL.Add(mySQL);
                                 cRS_Query.ExecSQL;
                                 cRS_Query.Active:=False;
                               end;
                            Последний раз редактировалось Romsan; 07.06.2006, 15:06.
                            Skit

                            Комментарий


                            • #15
                              ak4, тебе возможно пригодятся ещё функции:
                              // функции перевода денег в LDMoney и обратно
                              function fRSLDMon_Ext( Int1,Int2 : Integer; SmlInt : SmallInt ) : Extended;
                              function fRSExt_LDMon(ext : extended; var Int1,Int2 : Integer; var SmlInt : SmallInt ) : boolean;
                              // Конвертирование строк в формат RS Ansi to OEM DOS
                              function ConvertStrToRS (str:string):string;


                              Function fRSLDMon_Ext( Int1,Int2 : Integer; SmlInt : SmallInt ) : Extended;
                              Var
                              LDMon : record
                              LI1,LI2 : LongInt; { или LongInt }
                              SI : Word; { или Word }
                              end;
                              begin
                              LDMon.LI1 := Int1;
                              LDMon.LI2 := Int2;
                              LDMon.SI := SmlInt;
                              move(LDMon,Result,SizeOf(Result)); {копирует запись LDMon в результат функции}
                              end;

                              function fRSExt_LDMon(ext : extended; var Int1,Int2 : Integer; var SmlInt : SmallInt ) : boolean;
                              Var
                              LDMon : record
                              LI1,LI2 : LongInt;
                              SI : Word;
                              end;
                              begin
                              move(ext,LDMon,SizeOf(LDMon){ =10 }); {копирует запись LDMon в результат функции}
                              Int1 := LDMon.LI1;
                              Int2 := LDMon.LI2;
                              SmlInt := LDMon.SI;
                              result:=True;
                              end;
                              function ConvertStrToRS (str:string):string;
                              var i,n:byte;
                              begin
                              result:='';
                              for i:= 1 to length(str) do
                              begin
                              n:=ord(str[i]);
                              if n>239 then n:=n-16 else if n>191 then n:=n-64;
                              result:=result+chr(n);
                              end;
                              end;
                              Skit

                              Комментарий


                              • #16
                                ak4 учти, что структура postdoc.dbt и postdoc$.dbt в 90-ой меняется. Надо будет перерисовать SQL запрос.

                                Обрати внимание на функцию mCheck(Doc); - там не финансовые проверки документа, которые считаю выполнеными ранее, а приведение к нужному формату даты, прекодирование текста, заглушка на приведение валюты 810->0.
                                удачи.
                                Skit

                                Комментарий


                                • #17
                                  Skit ок,спасибо !

                                  Комментарий


                                  • #18
                                    Skit А что за функция mCheck(Doc)?

                                    Комментарий


                                    • #19
                                      а есть оч древняя компонента, не раз выкладываемая в этот форум, где есть работа через ключи битрива.

                                      Комментарий


                                      • #20
                                        ak4, mCheck на Ваше усмотрение, что хотите, то и проверяйте, естественно можете не проверять. Один из вариантов использования:
                                        function mCheck(var Doc:tRSPostDoc):byte; // Проверка и корректировка документа
                                        // коды ошибок 0 - успешное завершение
                                        // 1 - ошибка преобразования суммы в формат RS-Bank
                                        // 255 - неизвестная ошибка
                                        var
                                        sl,sh :integer;
                                        sp :smallint;
                                        res :boolean;
                                        begin
                                        result:=255;
                                        // Перевод из нормальной суммы в суммы RS
                                        res:=fRSExt_LDMon(StrToFloat(DOC.aSum)*100,sl,sh,sp);
                                        if res>True then
                                        begin
                                        MessageDlg('Ошибка преобразования суммы ('+DOC.aSum+') документа N'+DOC.aNumb_Document+' в формат RS-Bank', mtError, [mbOk], 0);
                                        result:=1;
                                        end else
                                        begin
                                        Doc.aSum_l:=IntToStr(sl); Doc.aSum_h:=IntToStr(sh); Doc.aSum_p:=IntToStr(sp);
                                        end;
                                        // Корректируем поле валюты для рублей
                                        if (DOC.aCode_Currency='810') AND (aValOper=False) Then DOC.aCode_Currency:='0';

                                        // Проверяем правильность даты
                                        if pos('.',DOC.aDate_Document)>0 then DOC.aDate_Document:=copy(DOC.aDate_Document,7,4)+'-'+copy(DOC.aDate_Document,4,2)+'-'+copy(DOC.aDate_Document,4,2);
                                        if pos('.',DOC.aDate_Value)>0 then DOC.aDate_Document:=copy(DOC.aDate_Value,7,4)+'-'+copy(DOC.aDate_Value,4,2)+'-'+copy(DOC.aDate_Value,4,2);
                                        // Проверяем определение счета получателя
                                        if DOC.aReal_Receiver='' then MessageDlg('Ошибка определения действительного счета получателя в документе N'+DOC.aNumb_Document, mtWarning, [mbOk], 0);
                                        if DOC.aAccount_Receiver='' then MessageDlg('Ошибка определения счета получателя в документе N'+DOC.aNumb_Document, mtWarning, [mbOk], 0);

                                        // Сюды вставлять проверки перед сохранением документа в RS

                                        result:=0;
                                        end;

                                        Данный вариант не "ловит" все ошибки и узконаправлен.

                                        Жека, конечно есть, но по ключам лучше бороздить из RSL (ИМХО, отстаивать не собираюсь).
                                        Skit

                                        Комментарий


                                        • #21
                                          Добрый вечер!
                                          Пытаюсь создать отложенный документ.
                                          1.Обязательно ли заполнить в postdoc.dbt ApplicationKey?
                                          2.И еще , русские буквы превратилис в абракадабру...как исправить это?
                                          3.Sum_h и Sum_h это для чего? В структуре их описания нету: -)...Опять таки ,обяз-о ли их заполнить?

                                          Вообще минимум какие поля надо заполнить ? например для мымры,платежки,приходника,расходника?

                                          Комментарий


                                          • #22
                                            ak4Обязательно ли заполнить в postdoc.dbt ApplicationKey?
                                            Нет.
                                            русские буквы превратилис в абракадабру
                                            ИМХО все дело в кодировке. РС использует cp866, а Delphi - cp1251. Напишите простенький конвертор.
                                            минимум какие поля надо заполнить ?
                                            Обратитесь к своим бухам. Они знают.
                                            В каждой программе есть по крайней мере одна ошибка

                                            Комментарий


                                            • #23
                                              2 ak4:
                                              Вообще минимум какие поля надо заполнить ? например для мымры,платежки,приходника,расходника?
                                              С конкретикой по Rs-Bank`у лучше в соответствующий подфорум. Там и ответят быстрее и более правильное место.

                                              Комментарий


                                              • #24
                                                Девочки и Мальчики - пользуйтесь тегом КОД если вставляете код
                                                форум разьезжается, читать трудно...
                                                Подавая сигналы в рог будь всегда справедлив, но строг. ©

                                                Комментарий


                                                • #25
                                                  Sum_h и Sum_h это для чего? В структуре их описания нету: -)...Опять таки ,обяз-о ли их заполнить?

                                                  Комментарий


                                                  • #26
                                                    2 ak4:
                                                    Sum_h и Sum_h это для чего?
                                                    Это представление поля сумма. 10-байтовое число представлено тремя частями: 4, 4 и 2 байта.
                                                    Опять таки ,обяз-о ли их заполнить?
                                                    Сумму документа? Может быть и не обязательно.

                                                    Напоминаю:
                                                    С конкретикой по Rs-Bank`у лучше в соответствующий подфорум.

                                                    Комментарий


                                                    • #27
                                                      Big_Mike ИМХО все дело в кодировке. РС использует cp866, а Delphi - cp1251. Напишите простенький конвертор

                                                      конвертор? оо,опять таки прошу помощи:- ) покажите пожалуйста как это сделать? :- )

                                                      Комментарий


                                                      • #28
                                                        ak4 покажите пожалуйста как это сделать? :- )
                                                        В РСЛе или в Делфях?
                                                        В каждой программе есть по крайней мере одна ошибка

                                                        Комментарий


                                                        • #29
                                                          Big_Mike дельфях

                                                          Комментарий


                                                          • #30
                                                            ak4

                                                            Код:
                                                            function ConvertStr(s:string):string;
                                                            var
                                                              p1,p2:PChar;
                                                            begin
                                                              p1:=StrAlloc(256);
                                                              p2:=StrAlloc(256);
                                                              StrPCopy(p1,s);
                                                              CharToOem(p1,p2);
                                                              ConvertStr:=StrPas(p2);
                                                              StrDispose(p1);
                                                              StrDispose(p2);
                                                            end;
                                                            В каждой программе есть по крайней мере одна ошибка

                                                            Комментарий

                                                            Пользователи, просматривающие эту тему

                                                            Свернуть

                                                            Присутствует 1. Участников: 0, гостей: 1.

                                                            Обработка...
                                                            X