Skip to content

AlfAleshkov/JSON-Test-task

Repository files navigation

JSON-Test-task

JSON Test task

Тестовое задание

Второй вопрос:
«2. Есть набор данных (артикул - цена), например:

16605.3 1499р
16605.4 1599р
16608 999р
и тд

Вы их откуда то получили единожды. А дальше вам надо будет к ним постоянно обращаться из разных функций. Как вы будете их хранить (на период работы программы) и как по определнному артикулу получать цену? Написать в виде кода.»

Наиболее логичным для этого считаю использование словарей, так же как и в Python'е, если не ошибаюсь их поддержка в Delphi появилась начиная с версий XE

dict:TDictionary<string, integer>;
...
dict:=TDictionary<string, integer>.Create;
...
dict.Free;

где string - артикул, он же ключ, по которому можно обращаться так же как к индексу массива, а тип данных содержимого - integer, ну или можно поставить Cardinal если отрицательные значения не нужны, или single если нужны знаки после запятой, ну или string если там же надо хранить "р."
для записи нового значения в словарь используется метод Add, например

dict.Add('16605.3',1499);

для чтения/записи в созданную ячейку, можно напрямую обращаться по индексу dict['16605.3']:=500;
Либо для чтения пользоваться методом TryGetValue если нет уверенности, что значение с таким ключом есть в принципе
Второй вариант, по-старинке, создать свой тип данных и сделать динамический массив из этих данных

type
  TPriceData = Record
    sku:string;
    price:integer;
  End;
...
  prices:array of TPriceData;
...
// тогда простой вариант добавления нового значения, без проверки на существование ключа, будет выглядеть так
SetLength(prices,Length(prices)+1);
with prices[Length(prices)-1] do begin
  sku:='16003.5';
  price:=2380;
  end;
...
// поиск значения по артикулу
function GetPrice(sku:string; var price:integer;):Boolean;
var
  i:integer;
begin
  Result:=false;
  For i:=0 to Length(prices)-1 do begin
    if prices[i].sku = sku then begin
      price:=prices[i].price;
      Result:=true;
      Exit;
      end;
  end;
end;

можно обернуть в отдельный класс, но всё равно считаю этот вариант менее предпочтительным, потому что придется также написать ряд функций, которые будут проверять уникальность ключа, поиск по ключу, хорошо бы добавить внутренюю сортировку для повышения эффективности поиска по ключу, в общем по новой изобретать велосипед, который уже реализован в TDictionary

Третий вопрос:
«3. На форме уже есть FDConnection, FDQuery, он настроены. Вам надо с помощью FDQuery вставить в таблицу testTable (art, title, price) значения:
16605.3 Щенячий патруль база спасателей 1499р
16605.4 Щенячий патруль спасатель 1599р
16608 Щенячий патруль гонщик 999р

и вывести в результате количество вставленных строк или ошибку»

var 
 RowsAffected:byte;
...
try
  RowsAffected:=0;
  FDQuery.SQL.Clear;
  FDQuery.ExecSQL('INSERT INTO testTable (art, title, price) VALUES (''16605.3'',''Щенячий патруль база спасателей'', ''1499р'')');
  RowsAffected:=RowsAffected+FDQuery.RowsAffected;
  FDQuery.ExecSQL('INSERT INTO testTable (art, title, price) VALUES (''16605.4'',''Щенячий патруль спасатель'', ''1599р'')');
  RowsAffected:=RowsAffected+FDQuery.RowsAffected;
  FDQuery.ExecSQL('INSERT INTO testTable (art, title, price) VALUES (''16608'',''Щенячий патруль гонщик'', ''999р'')');
  RowsAffected:=RowsAffected+FDQuery.RowsAffected;
  Memo.Lines.Add('Lines affected:'+IntToStr(RowsAffected));
except
  on E: EFDDBEngineException do
    Memo.Lines.Add('Error:'+e.Message);
end;

Или можно было через Bulk insert, но вот например FireBird его, увы, не поддерживает, а так был бы всего один INSERT

FDQuery.ExecSQL('INSERT INTO testTable (art, title, price) VALUES ( ... , ... , ... ),  ( ... , ... , ... ),  ( ... , ... , ... )');

Releases

No releases published

Packages

No packages published

Languages