Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 2006.01.15;
Скачать: [xml.tar.bz2];

Вниз

Создать таблицу на основе SQL запроса   Найти похожие ветки 

 
Devmaster   (2005-11-21 12:38) [0]

необходимо создать таблицу на основании даных из SQL запроса

делаю так:
begin
  OraSession.Connected:= True;
  qTemp.Close;
  qTemp.SQL.Text:= "select kod_xxx kod,st_name name from xx";
  qTemp.Open;

  tPredpr.Close;  
  qTemp.First;
//копирую структуру полей
  tPredpr.FieldDefs:= qTemp.FieldDefs;
  tPredpr.Active:= True;
//копирую все данные   - КАК ЭТО СДЕЛАТЬ ПОДРУГОМУ
 типа того как я скопировал структуру?
  while not qTemp.Eof do
  begin
    tPredpr.Insert;
    tPredpr.fields[0].Value:= qTemp.Fields[0].Value;
    tPredpr.fields[1].Value:= qTemp.Fields[1].Value;
    tPredpr.Post;
    qTemp.Next;
  end;

end;


 
ANB ©   (2005-11-21 12:42) [1]

create table Table1 as select  * from . . .


 
Sergey13 ©   (2005-11-21 12:42) [2]

1. А зачем вообще создавать таблицу на основе SQL запроса?
2. Зачем это делать так? Достаточно Create Table Table_name as Select ....


 
Devmaster   (2005-11-21 13:28) [3]

to ANB - tPredp - vTirtualTable - SQL не поддерживает! и создать нужно локально а не на сервере.

to Sergey13

> 1. А зачем вообще создавать таблицу на основе SQL запроса?

в начале работы приложения загрузить все в нее! потом во время работы вносить новые данные(до 100000 записей) а в конце закинуть на сервак  - вот как пока думаю возможно XML или както упакую!

Дело в том что запись на сервер очень долго идет и пользователь НЕРВНИЧАЕТ! а так в конце работы нажал кнопочку и все там!

Данные паралельно используют только для просмотра!


 
Sergey13 ©   (2005-11-21 13:34) [4]

2 [3] Devmaster   (21.11.05 13:28)
Пока не объяснишь что ты пытаешься сделать я буду считать твою схему работы неудачной (это я очень мягко сказал 8-).


 
evvcom ©   (2005-11-21 14:02) [5]


> Дело в том что запись на сервер очень долго идет и пользователь
> НЕРВНИЧАЕТ! а так в конце работы нажал кнопочку и все там!

А прикинь, как будет "нервничать" пользователь, если вдруг компьютер глюкнет, и все результаты его работы за день пропадут? Я думаю, живым ты домой не уйдешь.


 
Devmaster   (2005-11-21 14:36) [6]


> Sergey13 ©   (21.11.05 13:34) [4]
> 2 [3] Devmaster   (21.11.05 13:28)
> Пока не объяснишь что ты пытаешься сделать я буду считать
> твою схему работы неудачной (это я очень мягко сказал 8-
> ).


Я спросил как перенести даные из 1 набора в 2!
ты когда у людей спрашиваеш как пройти на такую-то улицу у тебя тоже спрашивают зачем? А то что ты считаеш мне до одного места!

> Sergey13 ©   (21.11.05 12:42) [2]
> 1. А зачем вообще создавать таблицу на основе SQL запроса?
>
> 2. Зачем это делать так? Достаточно Create Table Table_name
> as Select


Спрашиваеш зачем использовать SQL а сам пишеш SQL!


> evvcom ©   (21.11.05 14:02) [5]
>
> > Дело в том что запись на сервер очень долго идет и пользователь
>
> > НЕРВНИЧАЕТ! а так в конце работы нажал кнопочку и все
> там!
>
> А прикинь, как будет "нервничать" пользователь, если вдруг
> компьютер глюкнет, и все результаты его работы за день пропадут?
>  Я думаю, живым ты домой не уйдешь.


Это прога по 1 разовому залитию в месяц, файла на сервер, причем с проверкой каждого параметра(постояно спрашивать у базы есть ли такое...)

Так вот скорость работы увеличилась ~ в 5 раз ...


 
ANB ©   (2005-11-21 14:42) [7]


> evvcom ©   (21.11.05 14:02) [5]

Если все складывать в нормальные локальные таблицы то это не самая главная проблема.


> Devmaster   (21.11.05 13:28) [3]

1. Как собираешься контролировать ссылочную целостность ? (Справочники на сервере могут за день поправить и вся работа за день - на смарку).
2. Почему долго идет запись ? Сервер удаленный и канал тонкий ? Так АП уже писал системы с тонким каналом и все равно у него все шустро работало.
3. Если нужно сделать копию набора данных в TVirtualTable, то могу положить как пример копирование листа Excel :

unit Excel_Utils_U;

interface

uses
 Types, SysUtils, StrUtils,
 Variants,
 ComObj,
 DB, Ora, VirtualTable;

function ExcelToVirtualTable(FileName : String; var VirtualTable : TVirtualTable;
                            Area : TRect) : String;

implementation

function ExcelToVirtualTable(FileName : String; var VirtualTable : TVirtualTable;
                            Area : TRect) : String;
var ApplicationName : String;
   ExcelApplication : Variant;
   FieldNo, RowNo : Integer;
   FieldName : String;
   CellValue : String;
   Errors : String;
begin
Result := "";
Errors := "";
// Заготовим поля в VirtualTable
VirtualTable.Close;
VirtualTable.Clear;
VirtualTable.Fields.Clear;
VirtualTable.FieldDefs.Clear;
for FieldNo := Area.Left to Area.Right do begin
 FieldName := "F" + IntToStr(FieldNo);
 VirtualTable.AddField(FieldName, ftString, 1024, False);
end;
VirtualTable.Open;
// Запустим копию Excel
ApplicationName := "Excel.Application";
ExcelApplication := Null;
try
 ExcelApplication := CreateOleObject(ApplicationName);
except
 on E : Exception do begin
  Result := "Ошибка при создании экземпляра Excel : " + E.Message;
  Exit;
 end;
end;
try
 try
  // Сделаем Excel невидимым
  ExcelApplication.Visible := False;
  ExcelApplication.DisplayAlerts := False;
  // Откроем таблицу
  ExcelApplication.WorkBooks.Open(FileName);
  // Прогуляемся по таблице и перекачаем данные в VirtualTable
  for RowNo := Area.Top to Area.Bottom do begin
   VirtualTable.Append;
   for FieldNo := Area.Left to Area.Right do begin
    FieldName := "F" + IntToStr(FieldNo);
    CellValue := "";
    // "ComTrn"
    try
     CellValue := ExcelApplication.WorkBooks[1].WorkSheets[1].Cells[RowNo, FieldNo].Value;
    except
     on E : Exception do begin
      Errors := Errors
      + "Ошибка при получении ячейки ["+IntToStr(RowNo)+", "+IntToStr(FieldNo)+"] : "
      + E.Message
      + #13#10;
     end;
    end;
    VirtualTable.FieldByName(FieldName).AsString := CellValue;
   end;
   VirtualTable.Post;
  end;
  VirtualTable.First;
 except
  on E : Exception do begin
   Errors := Errors
   + "Ошибка при получении данных : "
   + E.Message
   + #13#10;
  end;
 end;
finally
 // Закроем копию Excel
 ExcelApplication.Workbooks[1].Close;
 ExcelApplication.Quit;
 ExcelApplication := Unassigned;
 // Вернем ответ
 if Length(Errors) > 0 then Result := Errors;
end;
end;

end.



 
ANB ©   (2005-11-21 14:51) [8]


> Devmaster   (21.11.05 14:36) [6]

Грубите, молодой человек, мастерам. Да еще и инкогнито.


 
Sergey13 ©   (2005-11-21 15:05) [9]

2[6] Devmaster   (21.11.05 14:36)
> Я спросил как перенести даные из 1 набора в 2!
Если оба набора уже в БД, то это безсмысенно в большинстве случаев.

>ты когда у людей спрашиваеш как пройти на такую-то улицу у тебя тоже спрашивают зачем?
Тут часто спрашивают подобное. Потом оказывается, что они вообще в другом городе находятся, и тут на той улице только морг. 8-)

>А то что ты считаеш мне до одного места!
Это ради бога. Не возражаю. 8-)

>Спрашиваеш зачем использовать SQL а сам пишеш SQL!
Ну и что? Я же говорил не о невозможности этого.

>Это прога по 1 разовому залитию в месяц, файла на сервер
Вот уже и файлы внешние появились. Ты из него SQL-ем читаешь? Каким образом?


 
Desdechado ©   (2005-11-21 15:17) [10]

без постановки задачи решения не бывает

если не уважаешь собеседника(ов), ответов не жди


 
Devmaster   (2005-11-21 15:28) [11]

один набор на сервере а другой локально! целостность не нарушится!

ребята, копирование структуры - tPredpr.FieldDefs:= qTemp.FieldDefs
есть чтото в таком стиле для переноса данных?


 
Devmaster   (2005-11-21 15:33) [12]

Извините за мою грубость, но если я буду рассказывать что я хочу сделать - пальцы заболят стукать по клаве:))  

для ANB
один набор на сервере а другой локально! целостность не нарушится!


> >Это прога по 1 разовому залитию в месяц, файла на сервер
> Вот уже и файлы внешние появились. Ты из него SQL-ем читаешь?
>  Каким образом?

ну и что что появились !  - смысл один КАК СКОПИРОВАТЬ ДАНЫЕ С ОДНОГО НАБОРА В ДРУГОЙ БЕЗ ИСПОЛЬЗОВАНИЯ SQL.

ребята, копирование структуры - tPredpr.FieldDefs:= qTemp.FieldDefs
есть чтото в таком стиле для переноса данных?


 
Sergey13 ©   (2005-11-21 15:37) [13]

2[12] Devmaster   (21.11.05 15:33)
> смысл один КАК СКОПИРОВАТЬ ДАНЫЕ С ОДНОГО НАБОРА В ДРУГОЙ БЕЗ ИСПОЛЬЗОВАНИЯ SQL.

Теперь перечитай свой вопрос

>необходимо создать таблицу на основании даных из SQL запроса

И сравни.


 
evvcom ©   (2005-11-21 15:40) [14]

FieldDefs насколько я помню это класс. В нем реализовано что-то типа
for i:=0 to FieldCount - 1 do ...
Реализуй аналогичное у себя. В чем проблемы? Там писать гораздо меньше, чем тут настукивать вопросы по клаве.


 
ANB ©   (2005-11-21 15:57) [15]


> Devmaster   (21.11.05 15:33) [12]

В таком стиле - нету. В каком то виртуальном дейтасете есть метод CopyFromDataSet, но тут уже жаловались, что он криво работает. А проблем то : пройтись в цикле по НД источнику и переложить данные в приемник. Пример у тебя перед глазами. Кстати, ща могу глянуть и для запросов.


 
evvcom ©   (2005-11-21 16:00) [16]


> Кстати, ща могу глянуть и для запросов

А чего там глядеть, DataSet он и в африке DataSet! Главное, сделать его редактируемым, остальное аналогично.


 
ANB ©   (2005-11-21 16:28) [17]


function Save_SQL(AParam : array of String; fmLog : TfmLog;
        var SessionList : TSessionList;
        sStepName, Expression : String) : String;
var sVarName, sSessionName, sSchema, sData, sErrors : String;
   Session : TOraSession;
   qrSQL : TOraQuery;
   vtData : TVirtualTable;
   smData : TStream;
   i, n : Integer;
   bStopSQL : Boolean;
begin
Result := "";
// Качнем параметры
sSessionName := ClearVarName(AParam[0]);
sVarName := ClearVarName(AParam[1]);
// Найдем или добавим нужную кверю
qrSQL := TOraQuery.Create(nil);
vtData := TVirtualTable.Create(nil);
smData := TMemoryStream.Create;
try
 // Найдем или добавим нужную сессию
 Session :=FindSession(sSessionName, SessionList, LocalParam,
 sStepName, Global_Error);
 if (Session.Connected) then begin
  // Если сессия открылась
  // Достанем схему
  sSchema := ClearVarName(GetVariable(sSessionName + "#Schema"));
  sErrors := ExecutePLSQLASync(Session, Expression, sSchema, fmLog, bStopSQL, qrSQL);
  // Выполнено с ошибкой или прервано пользователем
  if (Length(sErrors) > 0) then begin
   Result := sErrors;
   Exit;
  end;
  if (qrSQL <> nil) then begin
   // Сохраним из него результат
   n := qrSQL.FieldCount - 1;
   vtData.Close;
   vtData.Clear;
   vtData.DeleteFields;
   for i := 0 to n do begin
    if (qrSQL.Fields[i].DataType = ftString)
    then vtData.AddField(qrSQL.Fields[i].FieldName, ftString,
                         max(qrSQL.Fields[i].DataSize, 30))
    else vtData.AddField(qrSQL.Fields[i].FieldName, ftString, 30);
   end;
   // Качнем данные
   vtData.Open;
   while (not qrSQL.Eof) do begin
    vtData.Append;
    for i := 0 to n do begin
     vtData.Fields[i].AsString := qrSQL.Fields[i].AsString;
    end;
    vtData.Post;
    qrSQL.Next;
   end;
   // Закроем запрос
   qrSQL.Close;
   // Сохраним в поток
   vtData.SaveToStream(smData);
   vtData.Close;
   // Перепишем в строку
   i := smData.Size;
   SetLength(sData, i + 1);
   smData.Seek(0, 0);
   smData.Read(sData[1], i);
   SetVariable(sVarName, sData, 1);
  end;
 end else begin
  // Сессия не открылась
  Result := Global_Error;
 end;
finally
 if (qrSQL <> nil) then qrSQL.Close;
 if (vtData <> nil) then vtData.Close;
 if (qrSQL <> nil) then FreeAndNil(qrSQL);
 if (vtData <> nil) then FreeAndNil(vtData);
 if (smData <> nil) then FreeAndNil(smData);
end;
end;

Тут я, правда вообще в строку НД загоняю. Лишнее выкинешь.


 
Devmaster   (2005-11-21 16:51) [18]


> ANB ©   (21.11.05 15:57) [15]
>
> > Devmaster   (21.11.05 15:33) [12]
>
> В таком стиле - нету. В каком то виртуальном дейтасете есть
> метод CopyFromDataSet, но тут уже жаловались, что он криво
> работает. А проблем то : пройтись в цикле по НД источнику
> и переложить данные в приемник. Пример у тебя перед глазами.
>  Кстати, ща могу глянуть и для запросов.


Вот это и нужно было. Всем спасибо.


 
Juice ©   (2005-11-22 11:02) [19]

Может тебя это устроит ? -
ClientDataSet1.Data := ClientDataSet2.Data



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

Форум: "Базы";
Текущий архив: 2006.01.15;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.53 MB
Время: 0.013 c
14-1134818415
iamdanil
2005-12-17 14:20
2006.01.15
Компилятор-шифратор


6-1127921709
H@rdDrive
2005-09-28 19:35
2006.01.15
Location: http://home.site.ru/ - как перейти


2-1135526196
KEBZ
2005-12-25 18:56
2006.01.15
Умножение двоичных чисел.


1-1134323927
atruhin
2005-12-11 20:58
2006.01.15
Как промасштабировать картинку.


2-1135633583
Danja
2005-12-27 00:46
2006.01.15
Pen.Color хочу изменить цвет!





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский