Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > БД в Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 16.03.2021, 06:00   #1
Serega_SS
Пользователь
 
Регистрация: 15.03.2021
Сообщений: 15
Вопрос Рефакторинг Excel в ADOQuery, DBGrid

Здравствуйте!
Нуждаюсь в вашей помощи.
Есть задача, в Excel есть один столбик, его надо загрузить в DBGrid разделив на 2 столбика.
Код:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, DB, ADODB, Grids, DBGrids, StdCtrls, frxClass, frxExportBaseDialog,
  frxExportPDF, frxBarcode, frxDBSet, frxDesgn, Vcl.ExtCtrls;

type
  TVarioPrint = class(TForm)
    DataSource1: TDataSource;
    DBGrid1: TDBGrid;
    ADOConnection1: TADOConnection;
    ADOQuery1: TADOQuery;
    OpenDialog1: TOpenDialog;
    Button1: TButton;
    frxReport1: TfrxReport;
    frxDesigner1: TfrxDesigner;
    frxDBDataset1: TfrxDBDataset;
    frxBarCodeObject1: TfrxBarCodeObject;
    frxPDFExport1: TfrxPDFExport;
    Button2: TButton;
    Button3: TButton;
    Panel1: TPanel;
    Panel2: TPanel;
    Panel3: TPanel;
    Label1: TLabel;
    procedure FormKeyPress(Sender: TObject; var Key: Char);
    procedure Button1Click(Sender: TObject);
    procedure FormActivate(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure Button3Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  VarioPrint: TVarioPrint;

implementation

{$R *.dfm}

procedure TVarioPrint.FormKeyPress(Sender: TObject; var Key: Char);
begin
  if key = #27 then close;
end;


procedure TVarioPrint.Button1Click(Sender: TObject);
begin
  if not OpenDialog1.Execute then exit;
  ADOConnection1.Close;
  ADOConnection1.ConnectionString := 'Provider=Microsoft.ACE.OLEDB.12.0;Data Source=' + OpenDialog1.FileName + ';User ID=Admin;Password=;Extended Properties=Excel 8.0';
  Label1.Caption:=ExtractFileName(OpenDialog1.FileName);
  ADOConnection1.Open;

  ADOQuery1.SQL.Clear;
  ADOQuery1.SQL.Add('SELECT * FROM [Лист1$] WHERE [#] BETWEEN 1 and 15000 or [#] BETWEEN 15001 and 30000');
  ADOQuery1.Open;

end;


procedure TVarioPrint.Button2Click(Sender: TObject);
begin
frxReport1.ShowReport;
end;

procedure TVarioPrint.Button3Click(Sender: TObject);
begin
frxReport1.LoadFromFile('Config.fr3');
frxReport1.DesignReport;
end;

procedure TVarioPrint.FormActivate(Sender: TObject);
begin
  OpenDialog1.InitialDir := ExtractFilePath(Application.ExeName);
end;


end.
Serega_SS вне форума Ответить с цитированием
Старый 18.03.2021, 18:27   #2
Viktor61
Пользователь
 
Регистрация: 05.05.2018
Сообщений: 92
По умолчанию

Цитата:
Сообщение от Serega_SS Посмотреть сообщение
есть один столбик, его надо загрузить в DBGrid разделив на 2 столбика
По какому признаку будем делить? Пополам? Из расчета 1 к 3 или 1 к 4? Озвучьте, пож-та, Ваши пожелания!
Viktor61 вне форума Ответить с цитированием
Старый 18.03.2021, 19:45   #3
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,515
По умолчанию

Цитата:
ADOQuery1.SQL.Add('SELECT * FROM [Лист1$] WHERE [#] BETWEEN 1 and 15000 or [#] BETWEEN 15001 and 30000');
1. если сможем вместо * пишем как вычислять (SQL) нужные поля.
2. если нет, то всегда можно будет ...
добавляем к полученному набору данных вычислимые поля TCalcField (два) по числу новых колонок.
пишем процедуры(delphi) вычисления оных полей.
добавляем (и прячем) колонки в DBgrid.
программа — запись алгоритма на языке понятном транслятору

Последний раз редактировалось evg_m; 18.03.2021 в 19:50.
evg_m вне форума Ответить с цитированием
Старый 19.03.2021, 05:30   #4
Serega_SS
Пользователь
 
Регистрация: 15.03.2021
Сообщений: 15
По умолчанию

Доброе время суток.
У меня есть файл Excel в котором 4 столбика с данными и 60 тыс. строк.
Когда я делаю запрос
Код:
ADOQuery1.SQL.Add('SELECT * FROM [Лист1$] WHERE [#] BETWEEN 1 and 15000 or [#] BETWEEN 15001 and 30000 or [#] BETWEEN 300001 and 45000 or [#] BETWEEN 45001 and 60000');
то получается что к первой части запроса снизу добавляется вторая часть и так далее. А мне надо чтоб эта вторая часть добавилась в следующие столбики. Итак этот файл поделить на 4 части. Суть такова что мне надо поделить на 4 равные части и записать в оду таблицу.

Последний раз редактировалось Serega_SS; 19.03.2021 в 07:22.
Serega_SS вне форума Ответить с цитированием
Старый 19.03.2021, 05:33   #5
Serega_SS
Пользователь
 
Регистрация: 15.03.2021
Сообщений: 15
По умолчанию

Вот файл с которым работаю.
Вложения
Тип файла: xlsx Tab2.xlsx (1.64 Мб, 2 просмотров)
Serega_SS вне форума Ответить с цитированием
Старый 19.03.2021, 07:21   #6
Serega_SS
Пользователь
 
Регистрация: 15.03.2021
Сообщений: 15
По умолчанию

Вот так должна выглядеть таблица в итоге. Не знаю как это описать в программе.
Вложения
Тип файла: zip Refactor.zip (1,003.9 Кб, 3 просмотров)
Serega_SS вне форума Ответить с цитированием
Старый 19.03.2021, 09:04   #7
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,515
По умолчанию

что-то вроде такого
Код:
select t1.[#], t2.[#], t3.[#], t4.[#], --4 колонки [#]
   t1.*, t2.*, t3.*, t4.*  -- или так
from ( -- поля "первой" колонки 
         SELECT * FROM [Лист1$] WHERE [#] BETWEEN 1 and 15000 ) as t1  
left join ( --вторая 
             SELECT * FROM [Лист1$] WHERE [#] BETWEEN 15001 and 30000 ) as t2 on t1.[#]+15000 =t2.[#] 
left join ( -- третья 
              SELECT * FROM [Лист1$] WHERE [#] BETWEEN 300001 and 45000 ) as t3 on t1.[#]+30000 =t3.[#]
left join ( -- четвертая 
              SELECT * FROM [Лист1$] WHERE [#] BETWEEN 45001 and 60000 ) as t4 on t1.[#]+45000 =t4.[#]
программа — запись алгоритма на языке понятном транслятору

Последний раз редактировалось evg_m; 19.03.2021 в 09:08.
evg_m вне форума Ответить с цитированием
Старый 19.03.2021, 13:27   #8
Serega_SS
Пользователь
 
Регистрация: 15.03.2021
Сообщений: 15
По умолчанию

Цитата:
Сообщение от evg_m Посмотреть сообщение
что-то вроде такого
Код:
select t1.[#], t2.[#], t3.[#], t4.[#], --4 колонки [#]
   t1.*, t2.*, t3.*, t4.*  -- или так
from ( -- поля "первой" колонки 
         SELECT * FROM [Лист1$] WHERE [#] BETWEEN 1 and 15000 ) as t1  
left join ( --вторая 
             SELECT * FROM [Лист1$] WHERE [#] BETWEEN 15001 and 30000 ) as t2 on t1.[#]+15000 =t2.[#] 
left join ( -- третья 
              SELECT * FROM [Лист1$] WHERE [#] BETWEEN 300001 and 45000 ) as t3 on t1.[#]+30000 =t3.[#]
left join ( -- четвертая 
              SELECT * FROM [Лист1$] WHERE [#] BETWEEN 45001 and 60000 ) as t4 on t1.[#]+45000 =t4.[#]
Почти сработало. Если я делаю так
Код:
SELECT t1.*, t2.*  FROM (SELECT * FROM [Лист1$] WHERE [#] BETWEEN 1 and 15000) as t1
left join (SELECT * FROM [Лист1$] WHERE [#] BETWEEN 15001 and 30000) as t2 on t1.[#]+15000 =t2.[#]
Все срабатывает как надо. НО если я делаю так
Код:
SELECT t1.*, t2.*,  t3.*, t4.*  FROM (SELECT * FROM [Лист1$] WHERE [#] BETWEEN 1 and 15000) as t1
left join (SELECT * FROM [Лист1$] WHERE [#] BETWEEN 15001 and 30000) as t2 on t1.[#]+15000 =t2.[#] 
left join (SELECT * FROM [Лист1$] WHERE [#] BETWEEN 30001 and 45000) as t3 on t1.[#]+30000 =t3.[#]
left join (SELECT * FROM [Лист1$] WHERE [#] BETWEEN 45001 and 60000) as t4 on t1.[#]+45000 =t4.[#]
Выходит ошибка пропущен оператор (+15000 =t2.[#] ВОТ ТУТ left join)
Serega_SS вне форума Ответить с цитированием
Старый 19.03.2021, 14:04   #9
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,515
По умолчанию

Код:
select ...
from ....
left join ...
left join ...
left join ...
Цитата:
Почти сработало.
возможно нужно "добавить" скобок.
Код:
select ...
from ( ....
       left join ( ....
                   left join ( ...
                                left join ....
                             )
                  )
     )
и быть может немножко поменять on-условия.
все t1.[#]+... заменить соответственно на
t1.[#]+15000 =t2.[#]
t2.[#]+15000 =t3.[#]
t3.[#]+15000 =t4.[#]
а может и так получится.
программа — запись алгоритма на языке понятном транслятору
evg_m вне форума Ответить с цитированием
Старый 19.03.2021, 14:55   #10
Serega_SS
Пользователь
 
Регистрация: 15.03.2021
Сообщений: 15
По умолчанию

Цитата:
Сообщение от evg_m Посмотреть сообщение
а может и так получится.
Не получилось.
Пробовал оба способа.
все равно дает ошибку
Изображения
Тип файла: jpg Без имени-1.jpg (23.6 Кб, 0 просмотров)
Serega_SS вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
DBGrid, ADOQuery(обьединение двух таблиц) Delphi_ProGer БД в Delphi 3 21.12.2013 20:13
Слияние двух AdoQuery в одном DBGrid Марк Охман БД в Delphi 3 17.12.2010 21:27
ADOQuery и несколько DBGrid Leiph БД в Delphi 3 02.07.2010 16:57
DBGRID + ADOQuery - сортировка Dux БД в Delphi 4 15.06.2009 13:45
Обновление DBGrid + ADOQuery Demonk БД в Delphi 11 04.02.2009 13:42