Непонятки с массивом (запись из таблицы БД в массив)

Модератор: Модераторы

Ответить
jenny
новенький
Сообщения: 59
Зарегистрирован: 25.05.2015 21:45:27

Непонятки с массивом (запись из таблицы БД в массив)

Сообщение jenny »

Всем доброго времени суток!

Хотелось бы получить запись из таблицы БД (клиент) в массив.
Цель перенести данные с таблицы клиент в таблицy клиент_товар, так чтобы не было повторного переноса одной и той же записи (для этого создала массив). Мой код не работает, подскажите пожалуйста (нoвичку :) ) что можно тут сделать
Последний раз редактировалось jenny 20.08.2015 22:35:39, всего редактировалось 1 раз.
sts
энтузиаст
Сообщения: 519
Зарегистрирован: 04.04.2008 12:15:44
Откуда: Тольятти

Сообщение sts »

Код: Выделить всё

 Myarray: Array of Integer;
  i:Integer;
  begin
    ADOQuery1.last;
    SetLength(DynArray,AD.....

Код: Выделить всё

    SetLength(Myarray,AD..... ???//
kav
незнакомец
Сообщения: 3
Зарегистрирован: 04.08.2015 20:38:28

Сообщение kav »

наверное проблемав этом
SetLength(DynArray,ADOQuery1.RecordCount);
...
MyArray[i] := ADOQuery1.FieldByName('w_id').AsInteger;
jenny
новенький
Сообщения: 59
Зарегистрирован: 25.05.2015 21:45:27

Сообщение jenny »

:shock: Ой забыла переделать DynArray на MyArray. Но все равно ничего не выходит....
Аватара пользователя
Снег Север
долгожитель
Сообщения: 3067
Зарегистрирован: 27.11.2007 15:14:47
Контактная информация:

Сообщение Снег Север »

Не очень понятно, что именно не работает. Особенно по второй части - как там организованы циклы проверки. Кстати, если ваша база данных позволяет создавать временные таблицы, то намного эффективнее вытащить набор 'w_id' в такую таблицу, а не в паскалевский массив, и все проверки делать средствами SQL.
java73
постоялец
Сообщения: 257
Зарегистрирован: 21.11.2013 09:08:10

Сообщение java73 »

Запустите для начала в режиме отладки и поставьте маркер остановки в начале этого кода. Вдруг на какой-то строке что-то произойдет)
v-t-l
энтузиаст
Сообщения: 744
Зарегистрирован: 13.05.2007 16:27:22
Откуда: Belarus

Сообщение v-t-l »

jenny писал(а):Цель перенести данные с таблицы клиент в таблицy клиент_товар, так чтобы не было повторного переноса одной и той же записи

Если таблицы находятся в одной базе данных:

Код: Выделить всё

ADOQuery11.SQL.Text:=
'INSERT INTO klient_tovar (v_id) SELECT w_id FROM klienty WHERE w_id NOT IN (SELECT v_id FROM klient_tovar WHERE v_id IS NOT NULL);';
ADOQuery11.ExecSQL;

А может быть и ещё проще.

Добавлено спустя 7 часов 26 минут 17 секунд:
Кстати, при сравнении нескольких полей будет лучше слегка другой sql

Код: Выделить всё

INSERT INTO klient_tovar (v_id) SELECT w_id FROM klienty WHERE NOT EXISTS (SELECT v_id FROM klient_tovar WHERE klient_tovar.v_id = klienty.w_id);
jenny
новенький
Сообщения: 59
Зарегистрирован: 25.05.2015 21:45:27

Сообщение jenny »

спасибо за ответ!!
А если я не все данные и а только опеределённые перенести хочу, скажем выбераю пару строк и переношу
Последний раз редактировалось jenny 20.08.2015 22:36:57, всего редактировалось 1 раз.
Vadim
долгожитель
Сообщения: 4112
Зарегистрирован: 05.10.2006 08:52:59
Откуда: Красноярск

Сообщение Vadim »

jenny писал(а):А если я не все данные и а только опеределённые перенести хочу, скажем выбераю пару строк и переношу

В этом случае после WHERE (которое в SELECT) надо поставить условие, которое отберёт именно ту пару строк, которые Вам нужны.
jenny
новенький
Сообщения: 59
Зарегистрирован: 25.05.2015 21:45:27

Сообщение jenny »

не могли бы пожалуста объяcнить на примере, я в этом еще плохо разбираюсь
Vadim
долгожитель
Сообщения: 4112
Зарегистрирован: 05.10.2006 08:52:59
Откуда: Красноярск

Сообщение Vadim »

jenny
Тогда сначала расскажите, каким образом Вы точно узнаёте, что какая-то "пара строк" из исходной таблицы должна быть перемещена в другую таблицу?
jenny
новенький
Сообщения: 59
Зарегистрирован: 25.05.2015 21:45:27

Сообщение jenny »

при нажатии кнопки, происходит перенос строк/строки. Как это с sql запросом сделать я не знаю.
Последний раз редактировалось jenny 20.08.2015 22:36:17, всего редактировалось 1 раз.
Vadim
долгожитель
Сообщения: 4112
Зарегистрирован: 05.10.2006 08:52:59
Откуда: Красноярск

Сообщение Vadim »

jenny
Нет, Вы потом говорили про другое:
jenny писал(а):А если я не все данные и а только опеределённые перенести хочу, скажем выбераю пару строк и переношу

Здесь совершенно чётко написано, что эти строки Вы выбираете. По каким критериям?
jenny
новенький
Сообщения: 59
Зарегистрирован: 25.05.2015 21:45:27

Сообщение jenny »

выбираю по ID
Последний раз редактировалось jenny 20.08.2015 22:36:35, всего редактировалось 1 раз.
Vadim
долгожитель
Сообщения: 4112
Зарегистрирован: 05.10.2006 08:52:59
Откуда: Красноярск

Сообщение Vadim »

jenny писал(а):но запись все равно дублицируется

1. Это потому, что у Вас не установлен уникальный индекс по тем полям, которые не должны дублироваться своими значениями. ;-)
2.
jenny писал(а):WHERE NOT EXISTS (SELECT v_id FROM klient_tovar '+
' WHERE klient.w_id = klient_tovar.v_id

Вы пытаетесь искать по тем параметрам, которых нет. Поэтому результат отрицательный. Вы сначала потренируйтесь составлять запросы SELECT, который выдают Вам результат из второй таблицы отсутствующий в первой. Как только вы это получите, можете присоединять его к INSERT. Вот, например:

Код: Выделить всё

SELECT k.w_id FROM klient k WHERE NOT EXISTS (SELECT t.v_id FROM klient_tovar t WHERE t.v_id=k.w_id) 

Важное условие: столбцы k.w_id и t.v_id имеют одно и то же назначение.
Здесь происходит выборка кодов клиентов из таблицы klient, которые отсутствуют в таблице klient_tovar. По аналогии Вы можете составить своё условие, с помощью которого производится выборка именно тех строк, которых нет в таблице, в которую Вы хотите их вставить.
Ответить