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

Вниз

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

 
Scorpio ©   (2004-12-20 10:27) [0]

Создаю таблицу ч/з ADOCOmand пишу SELECT * INTO LILI FROM AS1, AS2, AS3 where ...
Теперь работаю с новой таблицей, делаю проверку по номерам, и если встречаются 2 одинаковых, то один из них мне нужно удалить, как мне это сделать ??

Пишу Table1.Delete - неработает.
    Table1["NI"] := "" - неработает
    Table1["NI"] := 0 - неработает

Если удалять ч/з DBNavigator1 визуально то работает, а как мне удалить ч/з него программно в программе. ??

   База DOS FOX


 
Соловьев ©   (2004-12-20 10:35) [1]

Пишу Table1.Delete - неработает.

Чушь. Может упаковать надо еще? Тоько вот не как это сделать через твоего провайдера...

Table1["NI"] := "" - неработает
Table1["NI"] := 0 - неработает

Интересный подход... Еще с бубном потанцевать не пробовал?


 
msguns ©   (2004-12-20 10:42) [2]

>Пишу Table1.Delete - неработает.
Таблица перед удалением открыта ? Как там на счет прав (какой коннект) ?

> Table1["NI"] := "" - неработает
Table1["NI"] := 0 - неработает

Несколько вопросов:
1. Прежде чем корректить запись, ей был дан Edit ?
2. Поле NI что, допускает и строку, и интежер ?
3. Опять же а) таблица открыта ? б) какой коннект ?


 
Anatoly Podgoretsky ©   (2004-12-20 10:44) [3]

DBNavigator просто делает Table1.Delete


 
Scorpio ©   (2004-12-20 11:08) [4]

Мне нужно либо удалить всю строку где встречаются 2 одинаковых номера, либо одному из номеров присвоить 0.
Поле INTEGER
К таблице имею полный доступ.


 
Anatoly Podgoretsky ©   (2004-12-20 11:11) [5]

Table1.Delete


 
sniknik ©   (2004-12-20 11:20) [6]

ADOCOmand это ADOCommand?
то значит и Table1 это ADOTable?

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

и отсюда следует, что
> Пишу Table1.Delete - неработает.
неработает это означает что удаление всетаки происходит (удаляет обе) а ошибку выкидывает о том, что "одновление влияет на много строк"...

(DBNavigator возможно просто это игнорирует)

решить можно разными способами, вернутся на BDE, взять другой компонент/провайдер для базы работающий локальными методами, и (самое сложное ;о)) добавить уникальное поле и забыть о том что у записи есть порядковый номер, ...наверное чтото еще...


 
Scorpio ©   (2004-12-20 11:20) [7]

Она мне сейчас выдала "Table1: Dataset not in edit or insert mode", причем ч/з DBNavigator удаляет, как мне еще можно удалить, может возможно ч/з SQL?
Команда DISTINCT мне неподходит, там есть одно поле которое неповторяется.


 
Scorpio ©   (2004-12-20 11:25) [8]

Она мне сейчас выдала "Table1: Dataset not in edit or insert mode", причем ч/з DBNavigator удаляет, как мне еще можно удалить, может возможно ч/з SQL?
Команда DISTINCT мне неподходит, там есть одно поле которое неповторяется.

Вообще я пишу:
while not Table1.Eof do
         begin
               N1 := Table1["NI"];

               Table1.Next;
               if n1 = Table1["NI"] then
                  Table1.delete;

         end;

Так она доходит до конца таблицы, вместо тогог чтобы выйти из нее она удаляет все записи от конца и до начала, причем записи исчезают, но если открыть ч/з SQL то все записи наместе а TABLE их невидит ниодной. Как это лечить ??


 
msguns ©   (2004-12-20 11:31) [9]

>Scorpio ©   (20.12.04 11:25) [8]

Оригинално !
Естественно, она удалит все ! А пошаговая отладка не для мушкетеров ? Я уж вообще молчу о "карандашном" методе.

По поводу того, что "SQL видит", а "TABLE не видит" - хоть что-нибудь почитай о коннекшинах и их свойствах, таких как подтверждения изменений, например.


 
sniknik ©   (2004-12-20 11:40) [10]

> возможно ч/з SQL?
конечно возможно! если умудришся составить условие удаления одной записи из 2х совершенно одинаковых... ;о))
DELETE FROM Table1 WHERE NI=0 AND ....???
(0 допустим признак этих обоих записей)
это можно только на провайдере который или поддерживает внутренний счетчик, либо есть доступ к номеру записи (что само по себе будет идентификатором)

> Так она доходит до конца таблицы, вместо тогог чтобы выйти из нее она удаляет все записи от конца и до начала, причем записи исчезают,
> но если открыть ч/з SQL то все записи наместе а TABLE их невидит ниодной. Как это лечить ??
ну судя по всему отключить режим ltBatchOptimistic.

> Вообще я пишу:
> while not Table1.Eof do
>         begin
>               N1 := Table1["NI"];

>              Table1.Next;
>               if n1 = Table1["NI"] then
>                  Table1.delete;

>         end;
неправильно (даже если бы это было верно логически для локального движка)

n1:= -1; //любое невозможное в таблице значение
while not Table1.Eof do begin
 if n1 = Table1["NI"] then Table1.delete
                      else begin
                             Table1.Next;
                             N1 := Table1["NI"];
                           end;
end;
и то это только если таблица отсортирована по N1 (одинаковые значения рядом)


 
sniknik ©   (2004-12-20 11:45) [11]

хотя возможно и у меня ошибка, давно с локальными таблицами не работал.
delete на последней записи переведет курсор на Eof или так и останется на последней (уже предпоследней)?


 
Scorpio ©   (2004-12-20 11:50) [12]

Я обрабатываю три таблицы и данные вношу в отдельную.
ADOCommand1.Parameters.ParamValues["LI1"] := Edit1.Text;
    ADOCommand1.CommandText := "SELECT LI.NI, LI.LA_, LI.LB_, LI.LC_, LI.LD_, LI.LJ_, LI.LP_, LI.LI_, LI.HP_, RA.JA_ into opi from LI, LNK, RA WHERE LI.HP_ like ""%5"" AND int(LI.LI_) = :LI1 AND LNK.IDL=35 AND LNK.REC1=LI.NI AND RA.NI=LNK.REC2 AND RA.JA_<DATE()";
    ADOCommand1.Execute;

Теперь я получаю таблицу OPI.dbf. Там номера по полю NI могут продублироваться, мне нужно либо удалить одну запись, либо номеру присвоить 1.

Как мне правильно написать выборку??
Уже неделю бьюсь, но фоксе сделал, а на дельфе неполучается.


 
msguns ©   (2004-12-20 12:02) [13]

>sniknik ©   (20.12.04 11:45) [11]

Лучший способ удаления повторяющихся:
- Отсортировать так, чтобы повторы были рядом
- Пройтись по НД и отметить дубли, ничего не удаляя.
- Удалить помеченные.

>Scorpio ©   (20.12.04 11:50) [12]

Однако, ты определись все же, чтО у тебя является критерием, по которому запись НЕ удаляется из группы с одинаковыми значениями анализируемого поля. Может, это и есть типа UID ? Тогда все проще. Если же такого поля нет, то введи суррогатное, типа автоинкремента. Именно по этому полю и будешь удалять.
Либо делай так, как я посоветовал в предыдущем абзаце.


 
sniknik ©   (2004-12-20 12:02) [14]

и не получится... ;о) пока все глюки не исправиш (для этого логику работы не поймеш)

сдесь к примеру параметру значение задаеш раньше чем он создается... нехорошо. ;о))


 
Соловьев ©   (2004-12-20 12:03) [15]

самое простое - создать таблицу с выборки с disctinct


 
sniknik ©   (2004-12-20 12:07) [16]

msguns ©   (20.12.04 12:02) [13]
> Лучший способ удаления повторяющихся:
для удаления полностью совпадающих записей? а как метку ставить? ;о))
лучший способ (рабочий в любом случае и для локального и клиент серверного движка поддерживающего sql)
SELECT DISTINCT * INTO Table2 FROM Table1
и удалить/переименовать таблицу.


 
msguns ©   (2004-12-20 12:12) [17]

>sniknik ©   (20.12.04 12:07) [16]
>для удаления полностью совпадающих записей? а как метку ставить? ;о))

Очень сложный вопрос. И философский. Но если глотнуть граммов 300, то приходит в голову простая мысль - записать в это самое повторяющееся поле что-нить типа "Тетя Феня - б...".
;)))


 
Scorpio ©   (2004-12-20 12:20) [18]

Удалено модератором
Примечание: дубль


 
Scorpio ©   (2004-12-20 12:22) [19]

А как пометить ??
А потом удалить ??
У меня они все отсортированны.

А как ввести сурогатное поле, когда таблица создается в SQL запросе??

Мне нужно либо присвоить любой номер строке "NI" либо удалить, для того чтобы с этой таблицей потом связать еще другие три базы.

А как мне обойти ошибку что мне сейчас выдала "Table1: Dataset not in edit or insert mode", причем ч/з DBNavigator удаляет, хотя я пытаюсь присвоить другой номер этому полю. ??

Правда я я пытаюсь работать ч/з TABLE а не ч/з ADOTable, т.к. он мне выдает Null into string.


 
Соловьев ©   (2004-12-20 12:23) [20]

хотя я пытаюсь присвоить другой номер этому полю. ??

А набор данных в каком состоянии? Читать до осознания действительности - TDataSet.State


 
msguns ©   (2004-12-20 12:30) [21]

>Scorpio ©   (20.12.04 12:20) [18]
>А как пометить ??

Присвоить "убитое" значение любому полю. Например, есть поле "Фамилия". Присвоить ему значение "УДАЛЯТЬ !"

>А потом удалить ??

Delete From Table Where "Фамлия"="УДАЛЯТЬ !"

>У меня они все отсортированны.
Да хоть 7 раз !!! Ни на что не влияет.

>А как ввести сурогатное поле, когда таблица создается в SQL запросе??

 Дописать в создающий запрос имя сурр.поля (наприамер "ID") и дать ему тип "Автоинкремент". Лиюо заполнить потом отдельной процедурой FieldByName(ID).AsInteger := RecNo;

>А как мне обойти ошибку что мне сейчас выдала "Table1: Dataset not in edit or insert mode", причем ч/з DBNavigator удаляет, хотя я пытаюсь присвоить другой номер этому полю. ??

Судя по всему, перед изменением записи твой код игнорирует перевод датасета в режим Edit. Для этого есть одноименный метод.
Ноафигатор же это делает (его писали люди, слава Богу, грамотные)


 
Scorpio ©   (2004-12-20 14:33) [22]

Судя по всему, перед изменением записи твой код игнорирует перевод датасета в режим Edit. Для этого есть одноименный метод.
Ноафигатор же это делает (его писали люди, слава Богу, грамотные)

Как мне правильно перевести таблицу в режим чтобы DataSet был в режиме EDIT ??


 
msguns ©   (2004-12-20 14:41) [23]

DataSet.Edit
При этом, ессно, он (датасет) должен быть редактируемым, т.е. тиа TADOTable или TADODataSet с соответсвующими "примочками"


 
Scorpio ©   (2004-12-20 14:55) [24]

Всем спасибо ЗАРАБОТАЛО.



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

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

Наверх





Память: 0.52 MB
Время: 0.036 c
1-1103842904
Homa_Programer
2004-12-24 02:01
2005.01.23
word((((


6-1099557535
AngelOKES
2004-11-04 11:38
2005.01.23
Socket и отправка файла в обе стороны


3-1103528250
Iova
2004-12-20 10:37
2005.01.23
Какое поле в таблице является первичным ключом


1-1105360466
Yurij-7
2005-01-10 15:34
2005.01.23
Два действия на одной кнопке


11-1087105674
Genie
2004-06-13 09:47
2005.01.23
Работа с Internet





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