Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2013.03.22;
Скачать: CL | DM;

Вниз

Нужна проверка слабых мест   Найти похожие ветки 

 
Разведка   (2012-06-03 14:57) [0]

Сделал импорт файла Excel в ADO во временную таблицу по определенным полям. Нужно проверить есть ли потенциально опасные места в коде при которых могут возникать ошибки при импорте... Например, пользователь укажет не верные данные в Excel или же импортируемая таблица будет иметь не те поля или неверные типы полей ну т.д.

type
TFrmMain = class(TForm)
JvDBGOutput: TJvDBGrid;
JvDBGInput: TJvDBGrid;;
GrBoxFind: TGroupBox;
ChBoxDateFind: TCheckBox;
Act_Import_TabOutput: TAction;
Act_Import_TabInput: TAction;
ConnectBase: TADOConnection;
QueryOutput: TADOQuery;
QueryInput: TADOQuery;
OpenDlg: TOpenDialog;
Query: TADOQuery;
QueryImport: TADOQuery;
procedure Act_Import_TabOutputExecute(Sender: TObject);
procedure Act_Import_TabInputExecute(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
procedure TableClear(TabName: String);
Procedure TabImportConnetion;
end;
var
 FrmMain:TFrmMain;
 CurPath,ConnStr:String;
Const mb_caption="Импорт расходов/приходов";
implementation

procedure TFrmMain.Act_Import_TabInputExecute(Sender: TObject);
begin
 //Вызов процедуры Диалога открытия и подключения таблицы Excel
 TabImportConnetion;
 //Проверка что QueryImport активный ()
 if Not QueryImport.Active then Exit;
  if (QueryImport.FindField("Дата")=Nil) or
    (QueryImport.FindField("Приход")=Nil) or
    (QueryImport.FindField("Валюта")=Nil) or
    (QueryImport.FindField("Информация")=Nil) then
   begin
     MessageBox(Handle,PChar("Неудалось выполнить импорт данных."),
        PChar(mb_caption),MB_ICONWARNING);
     exit;
   end;
 //Очистка всей таблицы TabOutput перед импортом данных
 TableClear("TabInput");
 //Цеклический перенос записей в базу из Excel
 QueryImport.First;
 While Not QueryImport.Eof do
   begin
     with Query do
       begin
         //Пропускается импорт строк имеющие пустые значения в значимых полях
   if QueryImport.FindField("Дата").IsNull or
            QueryImport.FindField("Приход").IsNull then
           begin
             QueryImport.next;
             Continue;
           end;        
   Close;SQL.Clear;
         SQL.Add("INSERT INTO TabInput (FDate,FInput,Valuta,Coment) ");
         SQL.Add("VALUES (:FDate,:FInput,:FValuta,:FComent)");
         //Заполнение параметров для запроса QueryImport из QueryImport
         Parameters.ParamByName("FDate").Value:=QueryImport.FindField("Дата").AsDateTime;
         Parameters.ParamByName("FInput").Value:=QueryImport.FindField("Приход").AsFloat;
         Parameters.ParamByName("FValuta").Value:=QueryImport.FindField("Валюта").AsStrin g;
         Parameters.ParamByName("FComent").Value:=QueryImport.FindField("Информация").AsS tring;
         ExecSQL;
       end;
     QueryImport.Next;
   end;
   QueryInput.Close;
   QueryInput.Open;
   QueryImport.Close;
   LblTabInput.Caption := "Файл таблицы Прихода: "+ExtractFileName(OpenDlg.FileName);
end;

procedure TFrmMain.Act_Import_TabOutputExecute(Sender: TObject);
begin
 //Вызов процедуры Диалога открытия и подключения таблицы Excel
 TabImportConnetion;
 if QueryImport.Active = false then Exit;
 if (QueryImport.FindField("Дата") = Nil) or
    (QueryImport.FindField("Расход") = Nil) or
    (QueryImport.FindField("Валюта") = Nil) or
    (QueryImport.FindField("Информация") = Nil) then
   begin
     MessageBox(Handle,PChar("Неудалось выполнить импорт данных."),
      PChar(mb_caption),MB_ICONWARNING);
     exit;
   end;
 //Очистка всей таблицы TabOutput перед импортом данных
 TableClear("TabOutput");
 //Цеклический перенос записей в базу из Excel
 QueryImport.First;
 While Not QueryImport.Eof do
   begin
     with Query do
       begin
   //Пропускается импорт строк имеющие пустые значения в значимых полях
         if QueryImport.FindField("Дата").IsNull or
            QueryImport.FindField("Расход").IsNull then
           begin
             QueryImport.next;
             Continue;
           end;
         Close;
         SQL.Clear;
         SQL.Add("INSERT INTO TabOutput (FDate,FOutput,Valuta,Coment) ");
         SQL.Add("VALUES (:FDate,:FOutput,:FValuta,:FComent)");
         // Заполнение параметров для запроса QueryImport из QueryImport
         Parameters.ParamByName("FDate").Value:=QueryImport.FindField("Дата").AsDateTime;
         Parameters.ParamByName("FOutput").Value:=QueryImport.FindField("Расход").AsFloat ;
         Parameters.ParamByName("FValuta").Value:=QueryImport.FindField("Валюта").AsStrin g;
         Parameters.ParamByName("FComent").Value:=QueryImport.FindField("Информация").AsS tring;
         ExecSQL;
       end;
       QueryImport.next;
   end;
   QueryOutput.Close;
   QueryOutput.Open;
   QueryImport.Close;
   LblFileTabOutput.Caption:="Файл таблицы расхода: "+ExtractFileName(OpenDlg.FileName);
end;

procedure TFrmMain.FormCreate(Sender: TObject);
begin
 CurPath:=ExtractFilePath(Application.ExeName);
 //Подключаем основную базу  base_test.mdb
 ConnStr:="Provider=Microsoft.Jet.OLEDB.4.0;"+
  "Data Source="+CurPath+"base_test.mdb;Persist Security Info=False";
 ConnectBase.ConnectionString := ConnStr;
 ConnectBase.Connected:=true;
 ConnectBase.BeginTrans;
 QueryOutput.Active:=True;
 QueryInput.Active :=True;
 JvGradient1.Align :=alClient;
end;

procedure TFrmMain.TabImportConnetion;
var SelSheet: integer;
begin
OpenDlg.FileName := "";
 if Not OpenDlg.Execute then Exit;
 //Подключение таблиццы Excel как базу данных в ADO
 ConnectImport.Close;
 QueryImport.Close;
 ConnectImport.ConnectionString := "Provider=Microsoft.Jet.OLEDB.4.0;"+
    "Data Source="+OpenDlg.FileName+
    ";Extended Properties=Excel 8.0;";
 //ConnectImport.Connected:=true;
 try
   ConnectImport.open;
     //Получаем список листов Книги из файла Excel
    FrmSelectSheet.LBoxSheets.Clear;
    ConnectImport.GetTableNames(FrmSelectSheet.LBoxSheets.Items);
    if FrmSelectSheet.LBoxSheets.Count = 0 then
     begin
      MessageBox(Handle,PChar("Не удалось из Excel ни одного листа"),PChar(mb_caption),MB_ICONWARNING);
      Exit;
     end;
    FrmSelectSheet.ShowModal;
 if FrmSelectSheet.LBoxSheets.ItemIndex = -1 then SelSheet := 0
 else SelSheet:=FrmSelectSheet.LBoxSheets.ItemIndex;
 //Делаем SQL запрос и получаем всю таблицу целиком в QueryImport
 //Из выбранного листа Excel
 QueryImport.Connection := ConnectImport;
 QueryImport.SQL.Text := "SELECT * FROM ["+FrmSelectSheet.LBoxSheets.Items[SelSheet]+"]";
 QueryImport.Open;
 except
   MessageBox(Handle,PChar("Не удалось получить данные из файла: "
      +ExtractFileName(OpenDlg.FileName)),
      PChar(mb_caption),MB_ICONWARNING);
   QueryImport.Close;
   exit;
 end;
end;

procedure TFrmMain.TableClear(TabName: String);
begin
 With Query do
 begin
  SQL.Clear;
  SQL.Text:="DELETE FROM "+TabName;
  ExecSQL;
 end;
end;
end.


 
Разведка   (2012-06-03 14:59) [1]

может быть код целиком сбросить на файлообменник?


 
sniknik ©   (2012-06-03 15:28) [2]

в Jet вся эта хрень с переносом данных в файл экселя делается одним запросом, для этого есть ISAM Excel.


 
Разведка   (2012-06-03 17:02) [3]


> sniknik ©   (03.06.12 15:28) [2]
> в Jet вся эта хрень с переносом данных в файл экселя делается
> одним запросом, для этого есть ISAM Excel.


Нужно что бы при переносе в новой таблице появлялись новые поля key -ключевое и Link -для связи, а еще проверка проводилась, те ли данные пользователь импортирует? ответствуют ли названия полей и нет ли лишних полей в таблице? Будет ли это выполняться в одном запросе?


 
sniknik ©   (2012-06-03 18:30) [4]

как напишешь. ты программист или где?


 
Разведка   (2012-06-03 19:07) [5]


> sniknik ©   (03.06.12 18:30) [4]
> как напишешь. ты программист или где?


А ведь всего все сразу и не узнаешь. Нужно что бы кто то направлял на правильные мысли.


 
sniknik ©   (2012-06-03 19:33) [6]

а я не направил? или нужно прямое указание? ну так, бери справку, и читай про исам-ы!


 
Разведка   (2012-06-04 19:40) [7]


> sniknik ©   (03.06.12 19:33) [6]
> а я не направил? или нужно прямое указание? ну так, бери
> справку, и читай про исам-ы!


Не понятно чем оно лучше?


 
Разведка   (2012-06-04 19:44) [8]


> sniknik ©   (03.06.12 19:33)


Поискал, по поисковикам информацию по вашему этому ISAM - результат
у людей только одни проблемы какие то сплошные весь инет завален только просьбами как исправить то одни глюки, то другие.  Впечатление такое, что такие технологи нам ненужны.


 
sniknik ©   (2012-06-04 19:51) [9]

> Не понятно чем оно лучше?
раз в 100 быстрее чем то, что сделаешь ты, даже если уберешь из кода выше все тормозные места.

> у людей только одни проблемы какие то
странно, а у меня их нет. вывод - я не человек, я программист.


 
Anatoly Podgoretsky ©   (2012-06-05 10:18) [10]


> Разведка   (04.06.12 19:40) [7]

Можешь не читать


 
KSergey ©   (2012-06-05 15:06) [11]

> Разведка   (03.06.12 14:57) 

А в чем ваш вопрос? Мне не понятно.
Говорите - надо сделать проверки - ну сделайте проверки, если надо.
А вы написали "надо сделать проверки" и привели портянку кода.

А в чем вопрос-то?



Страницы: 1 вся ветка

Текущий архив: 2013.03.22;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.049 c
15-1340605991
OldMBr
2012-06-25 10:33
2013.03.22
SendMessage


2-1333633351
Jimmy
2012-04-05 17:42
2013.03.22
Как правильно отобразить картинку с полупрозрачными пикселями?


2-1347519862
MsGuns
2012-09-13 11:04
2013.03.22
Колонка для "птичек" в гриде.


15-1349806763
Dimka Maslov
2012-10-09 22:19
2013.03.22
А всё таки почему


1-1298124684
Wadimka
2011-02-19 17:11
2013.03.22
Наложение Bitmap