Ошибка с разбором IHTMLDocument2 [сообщение #2480] |
Tue, 06 June 2023 07:48 |
harvest
Сообщений: 6 Зарегистрирован: June 2023
|
Junior Member |
|
|
Добрый день, т.к. sql.ru больше нет, надеюсь на новом сайте получится найти ответ.
Имеется небольшой кусочек кода, который работал до того как сайт обновил протоколы. Заменена компонента IdHTTP на NetHTTPClient, однако в строке не происходит полной загрузки строки в вариантный массив, хотя раньше все работало. Из-за этого коллекция элементов DocTR:=Doc.all.tags('TR') as IHTMLElementCollection; пустая.
Код процедуры:
ACurCodeN:=682;
CDate:=01.01.2022;
RDate:=28.02.2022;
URL:='https://www.cbr.ru/hd_base/seldomc/sc_dynamic/?UniDbQuery.Posted=True&UniDbQuery.From='+DateToStr(CDate)+'&UniDbQuery.To='+DateToStr(RDate)+'&UniDbQuery.ValID='+ACurCodeN;
try
//FDataModule.IdHTTP1.HandleRedirects:=true;
//AHTML:=FDataModule.IdHTTP1.Get(URL); //не работает из-за сайта
AHTML:=FdataModule.NetHTTPClient1.Get(URL).ContentAsString;
Doc:=coHTMLDocument.Create as IHTMLDocument2;
v:=VarArrayCreate([0, 0], varVariant);
v[0]:=AHTML;
Doc.write(PSafeArray(System.TVarData(v).VArray));
DocTR:=Doc.all.tags('TR') as IHTMLElementCollection;
for i:=1 to DocTR.length-1 do
begin
TRElement:= DocTR.Item(i,0) as IHtmlElement;
DocTD:=TRElement.children as IHTMLElementCollection;
if (DocTD.length>2) then
begin
ADate:=StrToDate((DocTD.Item(0, 0) as IHtmlElement).innerText);
AValue:=StrToCurr((DocTD.Item(2, 0) as IHtmlElement).innerText);
end
end
finally
Doc:=nil;
|
|
|
|
|
|
|
|
|
|
Re: Ошибка с разбором IHTMLDocument2 [сообщение #2494 является ответом на сообщение #2493] |
Thu, 08 June 2023 10:06 |
harvest
Сообщений: 6 Зарегистрирован: June 2023
|
Junior Member |
|
|
Такие команды тоже не работают при первом запуске программы. Хотя запись заносится в таблицу. Я ХЗ что не так... почему не выполняется последовательно код.
procedure TFUpdate.sButton1Click(Sender: TObject);
begin
FDataModule.FDQueryRead.Close;
FDataModule.FDQueryRead.SQL.Clear;
FDataModule.FDQueryRead.SQL.Text:='select max(CLD_DATE) from CALENDAR';
FDataModule.FDQueryRead.Open;
LastDate:=FDataModule.FDQueryRead.FieldByName('MAX').AsDateTime;
begin
while LastDate<=Date do
begin
FDataModule.FDTransactionWrite.StartTransaction;
try
FDataModule.FDQueryWrite.Close;
FDataModule.FDQueryWrite.SQL.Clear;
FDataModule.FDQueryWrite.SQL.Text:='update or insert into CALENDAR (CLD_DATE) values (:CldDate) matching(CLD_DATE)';
FDataModule.FDQueryWrite.Params.ParamByName('CldDate').AsDate:=LastDate;
FDataModule.FDQueryWrite.ExecSQL;
FDataModule.FDTransactionWrite.Commit;
except
FDataModule.FDTransactionWrite.Rollback;
raise;
end;
LastDate:=LastDate+1;
end;
end;
LastDate:=Date;
FDataModule.FDQueryRead.Close;
FDataModule.FDQueryRead.SQL.Clear;
FDataModule.FDQueryRead.SQL.Text:='select CLD_DATE from CALENDAR where CLD_DATE=:CurDate';
FDataModule.FDQueryRead.Params.ParamByName('CurDate').AsDate:=LastDate;
FDataModule.FDQueryRead.Open;
sMemo1.Text:=DateToStr(FDataModule.FDQueryRead.FieldByName('CLD_DATE').AsDateTime);
end;
|
|
|