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

Вниз

Как заполнить поле одной таблицы из другой - перенести данные   Найти похожие ветки 

 
Дмитрий   (2008-08-13 14:58) [0]

Здравствуйте!
Задача такая. Необходимо создать таблицу типа
Номер        |   Абонент
тип char 8  |  тип char 50

поля Номер должны заполнятся из результата выборки sql запроса к локальной таблице dbf
запрос типа
SELECT NUMER from "database.dbf" group by NUMER order by NUMER
в результате этого формируется список номеров, который надо теперь передать в созданную таблицу.
Поле абонент необходимо заполнить для каждого номера - Абонентская установка.
Для выборки SQL использую компонент query
_____________________________________________
какие будут советы и предложения для решения этой задачи
я не силен в знании о возможностях Delphi и SQL не удивлюсь если задача решается элементарно.

Жду ответов


 
Medbe}I{onok XML ©   (2008-08-13 15:02) [1]

table1.BatchMove(Query1,batCopy)


 
Сергей М. ©   (2008-08-13 15:04) [2]

Это одноразовая операция ?


 
Дмитрий   (2008-08-13 15:19) [3]

Да это одноразовая операция необходимо создать таблицу соответсвия номер - абонент...
спасибо Medbe}I{onok XML
щас попробую что это за зверь...


 
Sergey13 ©   (2008-08-13 15:21) [4]

> [0] Дмитрий   (13.08.08 14:58)
> запрос типа
> SELECT NUMER from "database.dbf" group by NUMER order by NUMER

Какие операторы ты еще можешь вставить в запрос? 8-)


 
Сергей М. ©   (2008-08-13 15:46) [5]


> Дмитрий   (13.08.08 15:19) [3]
>
> Да это одноразовая операция


Для этого и программу писать вовсе не надо, под ругой всегда немало готовых инструментов, с пом.которых довольно просто выполнить импорт/экспорт.
Например, средствами MS Office


 
Дмитрий   (2008-08-13 16:17) [6]

Сергей М
программу писать надо...
требуемая таблица нужна для формирования отчетов...
т.е. имеем экспорт из теледата (тарификация) в формате дбф
потом эта информация обрабатывается программой которую сейчас пишу
формируем различные sql запросы относительно того что введено в интерфейсной части программы
к полученному результату - применяем запрос объединения по полю номера с требуемой таблицей что бы в результате получить таблицу вида
абонент | номер | ....| время разговора
и затем все это экспортируется в отчет в exel.

по запросу
table1.BatchMove(Query1,batCopy)
сдесь получается копируется вся таблица?
мне надо скопировать только одно поле со всеми значениями в другую таблицу...


 
Medbe}I{onok XML ©   (2008-08-13 16:23) [7]

мне надо скопировать только одно поле со всеми значениями в другую таблицу...

что в квери то и копируется.
или TBatchMove + FieldMappings


 
Дмитрий   (2008-08-13 16:45) [8]

как работать с table?
вот код

if opend.Execute then
begin
Query2.Close;
Query2.SQL.Clear;
database:=Opend.FileName;
Query2.SQL.Add("SELECT NEBST from "+"""+database+"""+" group by NEBST order by NEBST");
Query2.Open;
DbiMakePermanent(query2.Handle, "temp_db.dbf",true);

count:=Query2.RecordCount;
with table1 do
begin
 Active := False;
 DatabaseName := "NUM";
 TableType := ttDBase;
 TableName := "numandname";
   if not Table1.Exists then begin
   with FieldDefs do begin
     Clear;
     with AddFieldDef do begin
//        Name := "NEBST";
       DataType := ftString;
       Size:=8;
       Required := True;
     end;
     with AddFieldDef do begin

       Name := "NAME";
       DataType := ftString;
       Size := 30;
     end;
   end;
   end;
end;

end;

выдает ошибку unknown database.

а можно ли обойтись без table
может еще одну query добавить...


 
Сергей М. ©   (2008-08-13 16:49) [9]


> программу писать надо


> имеем экспорт из теледата


Программа подразумевает многократное ее использование, в т.ч. реализованной в ней функциональности импорта/экспорта.

И в то же время ты утверждаешь, что импорт/экспорт - это однократная операция.

Сложно понять тебя, Саид)


 
stas ©   (2008-08-13 17:08) [10]

Если это MSSQL у него есть импорт/экспорт.


 
Дмитрий   (2008-08-13 17:40) [11]

Сергей М. Вы наверно не совсем поняли задачу...
вопрос по сабжу это однократная операция...
смысл ее создать таблицу (номер-имя абонента) которую будет использовать программа при формировании отчетов...т.е. каждому номеру будет соответсвовать имя абонентской установки...
хочется реализовать эту возможность в средствах программы...
допустим изменился нумерационный план или при переносе программы на другой сервер тарификации чтобы средствами программы можно было бы заново создать таблицу номер-абонент в которой будут внесены номера из таблицы которую дал экспорт из теледата. а значения имя абонетской усьановки при создании таблицы было бы для всех полей - "абонентская установка"...в программе так же реализуется возможность редактировать значение имя абонентской установки по введеному номеру.
таблица которую выдает теледата не содержит имя абонентской установки...
кроме того теледата предоставляет очень скудные средства для поиска информации...поэтому появилась необходимость в дополнительном средстве для поиска и формирования отчетов. По поиску из экспортируемой таблицы вопросов нет...эта часть программы практически готова...
теперь необходимо создать таблицу номер- абонент
и применять sql запрос объединения результата поиска и требуемой таблицы...что бы получить человекообразный отчет...
абонент|номер|***|время разговора
который будет экспортироватся в экс


 
stas ©   (2008-08-13 17:46) [12]

Дмитрий   (13.08.08 17:40) [11]

ниче непонял...

Ищите
Insert Into, Update, Select Into  и гетерогенные запросы

Для того чтобы вам ответить как это сделать нужно знать СУБД.


 
Medbe}I{onok XML ©   (2008-08-13 17:50) [13]

выдает ошибку unknown database.

А ты поверь в это


 
Дмитрий   (2008-08-13 17:51) [14]

СУБД локальная база через BDE dBASE
нашел вот такой код
procedure TTableRecordCopy(Source, Destination: TTable);

{ПРЕДПОЛОЖЕНИЕ: Обе таблицы имеют курсор в нужной строке и
компоненты Table ссылаются на таблицы с совместимыми величинами.}
var
i, lCount: Integer;
begin
lCount := Source.FieldCount;
for i := 0 to lCount - 1 do
if (not Source.Fields[i].IsNull) and (Source.Fields[i].CanModify) then
Destination.FieldByName(Source.Fields[i].FieldName).Assign(Source.Fields[i]);
end;

теперь как бы его применить...
два компонента table надо проинициализировать...
создать с помощью table таблицу пока не получается...
буду пробовать потом отпишусь что получилось


 
Medbe}I{onok XML ©   (2008-08-13 17:52) [15]

Query2.SQL.Clear;
database:=Opend.FileName;
Query2.SQL.Add("SELECT NEBST from "+"""+database+"""+" group by NEBST order by NEBST");
Query2.Open;

Жирным это что такое?


 
Дмитрий   (2008-08-13 17:54) [16]

Medbe}I{onok XML )) да верю я...
а как table познакомить с базой то...в BDE ковырять...или где...
подскажите пожалуйста


 
Дмитрий   (2008-08-13 17:56) [17]

Medbe}I{onok XML
это таблица из теледата, из этой таблицы формируется список номеров...


 
Дмитрий   (2008-08-13 18:02) [18]

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

if opend.Execute then
begin
Query2.Close;
Query2.SQL.Clear;
database:=Opend.FileName;
Query2.SQL.Add("SELECT NEBST from "+"""+database+"""+" group by NEBST order by NEBST");
Query2.Open;
DbiMakePermanent(query2.Handle, "temp_db.dbf",true);

count:=Query2.RecordCount;
with table1 do
begin
Active := False;
// DatabaseName := "NUM";
TableType := ttDBase;
TableName := "numandname";
  if not Table1.Exists then begin
  with FieldDefs do begin
    Clear;
    with AddFieldDef do begin
       Name := "NEBST";
      DataType := ftString;
      Size:=8;
      Required := True;
    end;
    with AddFieldDef do begin

      Name := "NAME";
      DataType := ftString;
      Size := 30;
    end;
  end;
  end;
end;

end;


 
Сергей М. ©   (2008-08-13 21:05) [19]


> Дмитрий   (13.08.08 18:02) [18]


Может лучше нанять программиста ?


 
Sergey13 ©   (2008-08-14 08:26) [20]

> [11] Дмитрий   (13.08.08 17:40)
> смысл ее создать таблицу (номер-имя абонента) которую будет
> использовать программа при формировании отчетов

А зачем ее вообще создавать?

> поля Номер должны заполнятся из результата выборки sql запроса
> к локальной таблице dbf

Почему недостаточно просто выполнить запрос
SELECT distinct NUMER from "database.dbf" order by NUMER
и работать с полученным датасетом?


 
Плохиш ©   (2008-08-14 10:14) [21]


> Сергей М. ©   (13.08.08 21:05) [19]

Знак вопроса лишний.


 
Anatoly Podgoretsky ©   (2008-08-14 10:32) [22]

> Плохиш  (14.08.2008 10:14:21)  [21]

Ну тогда и "может"


 
Юрий Зотов ©   (2008-08-14 15:25) [23]

Создать пустую TABLE2, а затем в любой подходящей тулзе проиграть вот этот скрипт:

insert into TABLE2
 (NUMBER, ABONENT)
 (select NUMBER, "Абонентская установка" from TABLE1)


 
Дмитрий   (2008-08-14 19:47) [24]

Юрий Зотов
Спасибо...
я уже думал об этом создал таблицу в аккесе...
тока не додумал как туда закинуть данные...
этот запрос в query надеюсь можно выполнить...


 
Дмитрий   (2008-08-14 19:52) [25]

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


 
Дмитрий   (2008-08-14 23:33) [26]

Ура заработало...
Вот какое решение я нашел...

создал функцию
procedure TFORM3.TTableRecordCopy(Source, Destination: TTable);

var
i, lCount: Integer;
begin
lCount:=Source.RecordCount;
for i:=1 to lCount do
begin
Destination.Insert;
Destination.FieldByName("NEBST").AsString:=Source.FieldByName("NEBST").AsString;
Destination.FieldByName("NAME").AsString:="Абонентская установка:";
Destination.Post;
Source.Next;
end;
end;

потом обработчике кнопки следующий код

procedure TForm3.Button2Click(Sender: TObject);
var
count,i: integer;
begin
if opend.Execute then
begin
Query2.Close;
Query2.SQL.Clear;
database:=Opend.FileName;
Query2.SQL.Add("SELECT NEBST from "+"""+database+"""+" group by NEBST order by NEBST");
Query2.Open;
DbiMakePermanent(query2.Handle, "temp_db.dbf",true);
count:=query2.RecordCount;
label3.Caption:=inttostr(count);
query2.Close;
query2.SQL.Clear;
if fileexists("temporary.dbf") then DeleteFile("temporary.dbf");
table1.TableName:="temporary.dbf";
table1.FieldDefs.Add("NEBST",ftString,8,false);
table1.FieldDefs.Add("NAME",ftstring,50,false);
table1.CreateTable;
table1.Open;
table2.TableName:="temp_db.dbf";
table2.Open;
TTableRecordCopy(table2,table1);
end;
end;


 
ChaosAD ©   (2008-08-27 18:16) [27]

обычная операция копирования, но почему так много кода?
select далее insert, при соответствии полей короче не придумаешь. Можно конечно сначала delete или drop с последующим созданием таблицы, тоже через Query.


 
ChaosAD ©   (2008-08-27 18:17) [28]

точнее не почему, а зачем????



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

Форум: "Начинающим";
Текущий архив: 2008.10.05;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.53 MB
Время: 0.005 c
2-1219955393
dars73
2008-08-29 00:29
2008.10.05
Проблема с записью в RichEdit


2-1219924155
workbench
2008-08-28 15:49
2008.10.05
ftp-клиент, IdFTP


15-1218269675
DevilDevil
2008-08-09 12:14
2008.10.05
Куча или стек ?


2-1219384408
arbin
2008-08-22 09:53
2008.10.05
работа c FTP


15-1218711018
Vlad Oshin
2008-08-14 14:50
2008.10.05
Об именах. Вот зачем так делать, да еще в пример ставить.





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский