23 октября, вторник 06:47
Bankir.Ru

Объявление

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

Нужен совет

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

  • Нужен совет

    Есть каталог 2008 в нем есть подкаталоги 01,02,03 ... 12.
    в каждом каталоге лежит по 31 файлу с расширением DBF
    нужно подсчитать общую сумму с каждого файла и вывести на экран.
    Как можно это сделать проще?

    в данный момент открываю каждый файл, считываю записи одного поля, наращиваю глобальную переменную ob_summ
    но очень много файлов... может есть метод проще

  • #2
    Расширение и структура файлов идентична

    Комментарий


    • #3
      а если селектом с помощью ADO ?
      Дважды досчитал до бесконечности (с)

      Комментарий


      • #4
        А можно пример? Я ни разу не работал с ADO, программирую в RSL пару недель.

        Комментарий


        • #5
          hackroot файлы то одинаковые?
          Дважды досчитал до бесконечности (с)

          Комментарий


          • #6
            Да, структура файлов одинаковая... (тип, поля, расширение и т.д.)

            Комментарий


            • #7
              Просто нужно проссумировать все записи по одному полю (одинаковое у всех) со всех файлов в каталогах 01,02,03 .. 12
              и вывести общий итог в переменную.

              Комментарий


              • #8
                Код:
                // вместо ODBC_DSN прописать название из одбс источника  к DSN
                private const conntectstr = "Provider=MSDASQL.1;Password=\"\";Persist Security Info=True;Data Source=ODBC_DSN;Mode=Read;";
                
                macro ado_ConnectEx(szConnectString:String)
                
                var con;
                
                    con = ActiveX("ADODB.Connection");
                    con.Open(szConnectString);
                
                return con;
                end;
                
                 
                /*------------------------------------------------------*/
                Macro PrepareSQL ()
                var ado = Null,
                    sql1 = "",
                    rs1 = null;
                    ado = ado_ConnectEx(conntectstr, null, null,null);
                
                
                   sql1 = 
                   "select  Sum(d.sum_field) " + 
                   "from  " +
                     "`\\\\SERVER\\floder`\\table.dbf  d "+
                  // другие таблицы если нужно для объединения
                  // одинарные кавычки нужны у меня без них отказывалось       //открывать таблицы
                   " where "+ 
                   "   d.some_field = {какое-то условие если нужно}";+
                   " group by d.field1,d.field2, .... ";
                   " order by d.fiels1,.field2, .... ";
                
                   rs1=ado.Execute(sql1);
                
                   if((not rs1.Eof) or (not rs1.Bof))
                     rs1.MoveFirst;
                     // ..............................
                
                   end;
                   return True;
                End;
                Что-то вроде этого

                чисто теоретически можно попробовать написать юнион из всех таблиц а потом получить одну сумму из него на нормальном SQL сервере это 100% проканало бы, в одбс не знаю, не пробовал, это немного вещь в себе
                Дважды досчитал до бесконечности (с)

                Комментарий


                • #9
                  У меня просто с DBF-ками программа (Коммуналка версия DOS) работает напрямую не использую драйвера Windows, поэтому через ODBC я с ними не работаю, и потом, это получается мне на каждом компе надо настраивать ODBC?
                  Мне просто нужно с этих DBF получить данные... просто их ужасно много, порядка 12*30=~360 файлов открывать в RSL
                  просто каждый прописывать и обрабатывать очень муторно и долго.
                  А если захотят другой год обработать... это жесть...

                  Комментарий


                  • #10
                    hackroot зачем на каждом компе? на сервере приложений можно один раз настроить
                    файлы лежат на локалах у юзера или на серваке?
                    Дважды досчитал до бесконечности (с)

                    Комментарий


                    • #11
                      На серваке.
                      Я пока не представляю как можно настроить ODBC на файлы DBF, т.к. их множество и они в разных папках.

                      Комментарий


                      • #12
                        hackroot Я пока не представляю как можно настроить ODBC на файлы DBF, т.к. их множество и они в разных папках.
                        не обязательно настраивать сам одибиси источник нужен тока для того чтоб указать параметры соединения и пр фигню
                        а файлы перебираются в самом запросе "`\\\\SERVER\\floder`\\table.dbf d "
                        надеюсь пути то хоть известны где они будут болтаться, а в остальном перебрать названия файлов по этим путям и маске *.dbf не сложная задача ))
                        Дважды досчитал до бесконечности (с)

                        Комментарий


                        • #13
                          в библиотечке lgs были процедуры работы с файлами.
                          Из старого нарыл пример копирования файлов с терминалами. У вас задача разве что гененить наименования файлов из DD,MM,YY.

                          PHP код:
                          Macro ScanTerminalFiles(date_c)
                          Var
                             
                          impFileName="",
                             
                          DD,MM,YY,
                             
                          Cont=False;


                             If (
                          ValType(date_c)==V_Date)
                                
                          Date_Carry=date_c;
                             
                          End;

                             
                          DateSplit(Date_Carry,dd,mm,yy);
                             If (
                          dd10)
                                
                          dd="0"+dd;
                             
                          End;
                             If (
                          mm10)
                                
                          mm="0"+mm;
                             
                          End;
                             
                          i_DocCount=0;
                             
                          FileImportDir=FileImportDir+YY+"\\"+MM+"\\"+DD+"\\";
                             
                          Cont=[B]lgFindFirst[/B](FileImportDir+FileMask,impFileName);
                             
                          aImpFileList=TArray;
                             
                          PrintLn(Time," Начало процедуры копирования файлов");
                             
                          PrintLn("Поиск файлов переводов в директории ",FileImportDir);
                             While (
                          Cont)
                                Print(
                          "Файл: ",impFileName);
                                If ([
                          B]lgTermServ[/B](FileImportDir+impFileName,RSFileDirCopy+iDesk+impFileName))
                                   
                          aImpFileList[aImpFileList.Size]=iDesk+impFileName;
                                   
                          PrintLn("... скопирован");
                                   
                          i_DocCount=i_DocCount+1;
                                Else
                                   
                          PrintLn(" : Ошибка копирования!");
                                   
                          MsgBox("Ошибка при копировании файлов на сервер Банка!|Повторите процедуру");
                                   Return 
                          False;
                                
                          End;
                                
                          Cont=lgFindNext(impFileName);
                             
                          End;

                             If (
                          ValType(date_c)==V_Date)
                                
                          SetParm(1,aImpFileList);
                             
                          End;
                             Return 
                          i_DocCount;
                          End
                          Для ваших dbf, как я понял подойдет обычный Open (DBF, Path+FileName)

                          Комментарий


                          • #14
                            ну а почему нельзя из-под RSL запустить cmd, глянуть файлы какие в каталогах (каталог то известен), по выводу-текстовику отпарсить его на предмет ".DBF" и с полученных названий не всасывать while~ом данные?
                            С уважением, Alex_Losk.

                            Комментарий


                            • #15
                              Alex_Losk ну а почему нельзя из-под RSL запустить cmd, глянуть файлы какие в каталогах (каталог то известен),

                              а в Delphi, или VBA, например, вы бы так же делали поиск файлов?

                              Комментарий


                              • #16
                                Adyan Alex_Losk ну вообще-то стандартный рсл-ный TDirList ищет
                                Дважды досчитал до бесконечности (с)

                                Комментарий


                                • #17
                                  сабжа. отстал, давно спеки не читал. предложил с налету. а тут, вот, видите ли, г-н Кубрин, подумал за нас.
                                  С уважением, Alex_Losk.

                                  Комментарий


                                  • #18
                                    Adyan, а зачем что нить со стороны? просто все с под rsl. любое усложнение ведет к неразберихе после автора.
                                    С уважением, Alex_Losk.

                                    Комментарий


                                    • #19
                                      Alex_Losk Adyan, а зачем что нить со стороны?
                                      Я такого не предлагал :-) - тоже к тому, что можно без всяких вызовов cmd

                                      Комментарий


                                      • #20
                                        RSL поддерживает рекурсию и работу с файлами. Этого достаточно чтобы решить данную задачу двумя макро процедурами. В первой нужно описать обработку одного файла переданного в качестве параметра (open ... close), во второй описать механизм перебора самих папок и фалов в качестве параметра передать путь к обнаруженному файлу (папке) и если это папка вызвать саму себя с новыми параметрами если это файл то обработать его первой процедурой.

                                        Комментарий


                                        • #21
                                          Пример второй процедуры. С первой, думаю, особых проблем не должно быть. Да суммировать нужно в переменной объявленной глобально.

                                          Код:
                                          import fileop;
                                          
                                          file fdbf() dbf;
                                          
                                          var
                                            Sum: Double;
                                          
                                          macro OpenDBF(FName: String)
                                          
                                            open(fdbf, FName);
                                          
                                            Sum = Sum + fdbf.Sum;
                                           
                                            close(fdbf);
                                          
                                          end;
                                          
                                          macro LoadFiles(Path: String, Mask: String)
                                          
                                            var 
                                              stat: Bool = false,
                                              FName: String = "",
                                              Attr : Integer = 0; /* Атрибут найденного файла */
                                          
                                            stat = FileFindFirst(Path + Mask, FName, Attr);
                                          
                                            while ( stat )
                                              if ( Attr = FILEOP_A_SUBDIR )
                                                LoadFiles(Path + FName);
                                              else
                                                OpenDBF(Path + FName);
                                              end;
                                              stat = FileFindNext(FName, Attr);
                                            end;
                                          
                                            FileFindClose();
                                          
                                          end;
                                          
                                          LoadFiles("..\\2008\\", "*.dbf");
                                          Почти готовое решение...

                                          P.S.
                                          Писал без проверки, возможны синтаксические ошибки.
                                          Последний раз редактировалось AlienUfo; 18.07.2008, 14:28.

                                          Комментарий


                                          • #22
                                            AlienUfo Почти готовое решение...

                                            а import fileop; это чьё?

                                            Комментарий


                                            • #23
                                              Сообщение от Adyan Посмотреть сообщение
                                              AlienUfo Почти готовое решение...

                                              а import fileop; это чьё?
                                              Родное...

                                              Комментарий


                                              • #24
                                                AlienUfo Родное...
                                                тогда еще описалово надо :-)

                                                Комментарий


                                                • #25
                                                  Сообщение от Adyan Посмотреть сообщение
                                                  AlienUfo Родное...
                                                  тогда еще описалово надо :-)
                                                  см. fileop.rar в нем fileop.d32 а чего описывать и так вроде все понятно!?

                                                  Комментарий


                                                  • #26
                                                    я бы так сделал:
                                                    Код:
                                                    d1=date(01,01,2008);
                                                    d2=date(31,12,2008);
                                                    t=d1;
                                                    while(t=d2)
                                                      datesplit(t,d,m,y);
                                                      p=сформироватьпуть(d,m,y);
                                                      if(ExistFile(p+fn))
                                                        OpenDbf();
                                                      end;
                                                      t=t+1;
                                                    end;

                                                    Комментарий


                                                    • #27
                                                      Пасиб! Помогли!
                                                      И еще один маленький вопрос, просто хочется посмотреть приемы программирования!
                                                      Вот например имеется таблица с одинаковыми счетами, как можно быстро сложить суммы этих счетов и вывести на экран?
                                                      к примеру
                                                      90202111111111111110001 = 123.24
                                                      90202111111111111110001 = 52.25
                                                      90202111111111111110002 = 30.23
                                                      90202111111111111110002 = 64.25
                                                      90202111111111111110001 = 53.50

                                                      чтобы вывелось на экран 2 счета с общими суммами

                                                      Комментарий


                                                      • #28
                                                        hackroot в RSL есть функция RestB остатки по бал.счету за период в которой можно подключить макрос для фильтрации необходимых счетов, т.е. достаточно написать небольшой макрос, который возвращает попадать или не попадать в расчет в зависимости от маски счета.
                                                        Дважды досчитал до бесконечности (с)

                                                        Комментарий


                                                        • #29
                                                          hackroot Вот например имеется таблица с одинаковыми счетами
                                                          А индексов нет чтоль? Наверняка есть.
                                                          Сортируйте, а делее

                                                          if (счет повторяется) суммируем
                                                          else печать итогов
                                                          end

                                                          Комментарий


                                                          • #30
                                                            попробуйте класс Hash из sets.maс

                                                            Комментарий

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

                                                            Свернуть

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

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