Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Загрузка курсов валют из интернета в БД / 6 сообщений из 6, страница 1 из 1
06.03.2021, 18:42
    #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
06.03.2021, 18:54
    #40051325
defecator
Модератор форума
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Загрузка курсов валют из интернета в БД
Если у тебя нормальная СУБД типа Оракла,
то вся эта портянка пишется на том же PL/SQL в виде хранимки в десяток-другой строк
...
Рейтинг: 0 / 0
06.03.2021, 19:17
    #40051329
softwarer
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Загрузка курсов валют из интернета в БД
harvest6
Код рабочий

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

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

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

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

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

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

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

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

??

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


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