powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Загрузка курсов валют из интернета в БД
6 сообщений из 6, страница 1 из 1
Загрузка курсов валют из интернета в БД
    #40051323
harvest6
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Код рабочий, но не уверен в его правильности и эффективности. Можно ли каким-нибудь образом оптимизировать?

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
procedure TFUpdate.sButton1Click(Sender: TObject);

var AXMLData: TXMLDocument;
    AXML: TStringStream;
    RootNode, ValNode: IXMLNode;
    i, ACurID, ACldID: Integer;
    AName, ACodeNum, ACodeLet: string;
    AValue: Double;
    ADate, CDate, LastDate: TDateTime;
begin
  //1.Проверка существования даты в календаре
  FDataModule.FDQueryRead.Close;
  FDataModule.FDQueryRead.SQL.Text:='select max(CLD_DATE) from CALENDAR';
  FDataModule.FDQueryRead.Open;
  LastDate:=FDataModule.FDQueryRead.FieldByName('MAX').AsDateTime;
  while LastDate<=Date do
  begin
    FDataModule.FDTransactionWrite.StartTransaction;
    try
      FDataModule.FDQueryWrite.Close;
      FDataModule.FDQueryWrite.SQL.Text:='update or insert into CALENDAR (CLD_DATE) values (:CurDate) matching(CLD_DATE)';
      FDataModule.FDQueryWrite.Params.ParamByName('CurDate').AsDate:=LastDate;
      FDataModule.FDQueryWrite.ExecSQL;
      FDataModule.FDTransactionWrite.Commit;
    except
      FDataModule.FDTransactionWrite.Rollback;
    raise;
    end;
    LastDate:=LastDate+1;
  end;
  //2.Загрузка курсов валют с ЦБ
  FDataModule.FDQueryRead.Close;
  FDataModule.FDQueryRead.SQL.Text:='select min(CLD_DATE) from CURRENCY_RATE_VIEW join CURRENCY on CUR_ID=CURRAT_CUR_ID where CUR_INTERNET=TRUE';
  FDataModule.FDQueryRead.Open;
  CDate:=FDataModule.FDQueryRead.FieldByName('MIN').AsDateTime;
  while CDate<=Date do
  begin
    AXML:=TStringStream.Create('', TEncoding.UTF8);
    try
      IdHTTP1.Get(CUR_URL_CBR+DateToStr(CDate), AXML);
      AXMLData:=TXMLDocument.Create(Application);
      try
        AXMLData.LoadFromStream(AXML);
        RootNode:=nil;
        RootNode:=AXMLData.ChildNodes.FindNode('ValCurs');
        if Assigned(RootNode) then
        begin
          ADate:=StrToDate(RootNode.Attributes['Date']);
          if ADate<>CDate then ADate:=CDate;
          for i := 0 to Pred(RootNode.ChildNodes.Count) do
          begin
            ValNode:=RootNode.ChildNodes.Get(i);
            AName:=ValNode.ChildValues['Name'];
            ACodeNum:=ValNode.ChildValues['NumCode'];
            ACodeLet:=ValNode.ChildValues['CharCode'];
            AValue:=ValNode.ChildValues['Value'];
            FDataModule.FDQueryRead.SQL.Text:='select CLD_ID from CALENDAR where CLD_DATE=:CurDate';
            FDataModule.FDQueryRead.Params.ParamByName('CurDate').AsDate:=ADate;
            FDataModule.FDQueryRead.Open;
            ACldID:=FDataModule.FDQueryRead.FieldByName('CLD_ID').AsInteger;
            FDataModule.FDQueryRead.Close;
            FDataModule.FDQueryRead.SQL.Text:='select CUR_ID from CURRENCY where CUR_CODE_LET=:CodeLet and CUR_INTERNET=TRUE';
            FDataModule.FDQueryRead.Params.ParamByName('CodeLet').AsString:=ACodeLet;
            FDataModule.FDQueryRead.Open;
            ACurID:=FDataModule.FDQueryRead.FieldByName('CUR_ID').AsInteger;
            FDataModule.FDQueryRead.Close;
            if ACurID<>0 then
            begin
              FDataModule.FDTransactionWrite.StartTransaction;
              try
                FDataModule.FDQueryWrite.Close;
                FDataModule.FDQueryWrite.SQL.Text:='update or insert into CURRENCY_RATE (CURRAT_CUR_ID, CURRAT_CLD_ID, CURRAT_RATE) values (:CurID, :CurDate, :CurRate) matching(CURRAT_CUR_ID, CURRAT_CLD_ID)';
                FDataModule.FDQueryWrite.Params.ParamByName('CurID').AsInteger:=ACurID;
                FDataModule.FDQueryWrite.Params.ParamByName('CurDate').AsInteger:=ACldID;
                FDataModule.FDQueryWrite.Params.ParamByName('CurRate').AsFloat:=AValue;
                FDataModule.FDQueryWrite.ExecSQL;
                FDataModule.FDTransactionWrite.Commit;
              except
                FDataModule.FDTransactionWrite.Rollback;
              raise;
              end;
            end;
          end;
        end;
      finally
        FreeAndNil(AXMLData)
      end;
    finally
      FreeAndNil(AXML)
    end;
    CDate:=CDate+1;
  end;
end;


...
Рейтинг: 0 / 0
Загрузка курсов валют из интернета в БД
    #40051325
Фотография defecator
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
Если у тебя нормальная СУБД типа Оракла,
то вся эта портянка пишется на том же PL/SQL в виде хранимки в десяток-другой строк
...
Рейтинг: 0 / 0
Загрузка курсов валют из интернета в БД
    #40051329
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
harvest6
Код рабочий

И первым делом при запуске на пустой таблице вставляет в неё 30 декабря 1899-го года, не так ли?

harvest6
Можно ли каким-нибудь образом оптимизировать?

Можно. Причём полностью. Здесь нет ни одной строки, которую стоило бы оставить в хорошем варианте реализации.
...
Рейтинг: 0 / 0
Загрузка курсов валют из интернета в БД
    #40051330
Softologic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
softwarer
harvest6
Код рабочий

И первым делом при запуске на пустой таблице вставляет в неё 30 декабря 1899-го года, не так ли?

harvest6
Можно ли каким-нибудь образом оптимизировать?

Можно. Причём полностью. Здесь нет ни одной строки, которую стоило бы оставить в хорошем варианте реализации.

В этой схеме есть одно серьезное упущение - при проблемах со связью (с интернетом\доступом к страничке), вся программа может наглухо зависнуть. Я у себя в проекте, в связи с этим, получение курса непосредственно определил в отдельный поток с idle-приоритетом.
...
Рейтинг: 0 / 0
Загрузка курсов валют из интернета в БД
    #40051333
Фотография Dmitry Arefiev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Softologic
с idle-приоритетом.

??
...
Рейтинг: 0 / 0
Загрузка курсов валют из интернета в БД
    #40051340
Softologic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dmitry Arefiev
Softologic
с idle-приоритетом.

??

Пардон, перепутал с другим потоком. Normal на самом деле:)
...
Рейтинг: 0 / 0
6 сообщений из 6, страница 1 из 1
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Загрузка курсов валют из интернета в БД
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]