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

Вниз

ADOTable - ошибка при подключении   Найти похожие ветки 

 
Scorpio ©   (2005-02-09 10:12) [0]

Добрый день мастера, подскажите пишу:

ADOTable1.Active := true;
ADOTable1.First;
while not ADOTable1.Eof do
    begin
         ADOTable1.Next;
    end;


А когда запускаю компилятор она мне выдает:
Could not convert variant of type(Null) into type (String)  

Как мне это лечить ??


 
Плохиш ©   (2005-02-09 10:16) [1]

Проверяй в событиях для твоей ADOTable1, а не пустой ли набор данных.


 
Scorpio ©   (2005-02-09 10:20) [2]

Непонял?? Это как, таблица есть, и если ее открыть просто ч/з ADOTable без компилятора, в DBGride то я эту таблицу вижу очень отчетливо и без ошибок, а когда запускаю компилятор, то она мне выдает ошибку.


 
Anatoly Podgoretsky ©   (2005-02-09 10:21) [3]

Это не ошибка подключения, а ошибка преобразования неверных данных. А смысл какой данной конструкции, тут более правильно использовать sleep


 
Anatoly Podgoretsky ©   (2005-02-09 10:22) [4]

Scorpio ©   (09.02.05 10:20) [2]
Поделись с народом компиляторов в гриде.


 
Плохиш ©   (2005-02-09 10:27) [5]


>Scorpio ©   (09.02.05 10:20) [2]

А не надо использовать конструкции типа String1 := ADOTable1["NullValue"];


 
Scorpio ©   (2005-02-09 10:28) [6]

Мне нужно чтобы она не ждала определенное время, а произвела обработку данных, там мне нужно произвести двойную обработку по таблице, т.е. беру первое значение запоминаю позицию, затем спускаюсь ниже, и если есть определенные условия то удаляю ненужные строки, а затем поднимаюсь к первой записи и опускаюсь к следующе и т.д. и проделываю тоже самое с ней.
  Ч/з ADODataSet у меня неочень получилось, хочу попробовать ч/з ADOTable.


 
Плохиш ©   (2005-02-09 10:32) [7]

asString + F1


 
Scorpio ©   (2005-02-09 10:32) [8]

String1 := ADOTable1["NullValue"]; ??

Та конструкция что сверху это вся моя программа. А ошибку выдает, я же никакие переменные неиспользую??


 
Плохиш ©   (2005-02-09 10:35) [9]


>Scorpio ©   (09.02.05 10:32) [8]

1. С учётом [2] и [6], врёшь.
2. Чудес не бывает.


 
Scorpio ©   (2005-02-09 10:37) [10]

Плохиш у тебя какой Delphi ??


 
Anatoly Podgoretsky ©   (2005-02-09 10:38) [11]

Scorpio ©   (09.02.05 10:28) [6]
Обработки данных в коде не наблюдается, а наблюдается только организация паузы, а для организации пауз sleep более подходящ.


 
Anatoly Podgoretsky ©   (2005-02-09 10:39) [12]

Scorpio ©   (09.02.05 10:37) [10]
В потрепаться, там ты узнаешь не только Про него и про других, выборка будет более репрезентативная.


 
ЮЮ ©   (2005-02-09 10:45) [13]

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

код для выделенного покажи


 
Scorpio ©   (2005-02-09 10:47) [14]

Anatoly Podgoretsky

Мне ненужна пауза в программе, я немогу просто без ошибки подключить базу, я могу дать исходный код с использованием ADODataSet, но он очень гомоздкий, и у меня в конце неполучалось запомнить те записи которые я удалил, поэтому я хочу попробоватиь ч/з ADOTable, но здесь возникла ошибка, при запуске программы, онав мне кидает ошибку, а затем после повторного запуска, она производит прогон таблицы. Как мне избежать этой ошибки при подключении, даже если я сразу ADOTable прсваиваю ACTIVE = TRUE, всеравно она после запуска программы сначала выдает ошибку, и затем после повторного запуска производит прогон по таблице.


 
janb   (2005-02-09 10:50) [15]

Просто напиши что ты хочешь этим сделать подробнее. Смысл


 
Scorpio ©   (2005-02-09 10:51) [16]

procedure TForm1.BitBtn1Click(Sender: TObject);
var i, n, i1, mo, yd, k4, re : integer;
   rr : array of integer;
   mas : array [1..100] of integer;
   report : array [1..20,1..1000] of integer;
   metka, metka1 : TBookmark;
label    l1, l2, l3, l4 ;
// mo - ?? ??????? ??????? ???????
// yd - ????? ??
begin
    rr := 0;
    SetLength(rr, 21);

    ADODataSet1.Active := true;
//     ADOTable2.Active := true;
//     ADOTable2.First;
    ADODataSet1.First;
    i := 0;
    i1 := 0;
l3:  while not ADODataSet1.eof do
         begin
              ADODataSet1.DisableControls;
              if ADODataSet1.FieldByName("re_").IsNull then
                begin
                     DataSource1.DataSet.Edit;
                     ADODataSet1.Delete;
                     DataSource1.DataSet.Edit;
                     ADODataSet1.Post;
                end
                else
                    begin
                         re := ADODataSet1.FieldByName("re_").AsInteger;
                         if (re = 1) or (re = 30) or (re = 34) or (re = 37) or (re = 41) or (re = 42) or (re = 44) then
                           begin
                                DataSource1.DataSet.Edit;
                                ADODataSet1.Delete;
                                DataSource1.DataSet.Edit;
                                ADODataSet1.Post;
                                goto l3;
                           end;

                    end;

              if ADODataSet1.FieldByName("wh_").IsNull then
                begin
                     DataSource1.DataSet.Edit;
                     ADODataSet1.Delete;
                     DataSource1.DataSet.Edit;
                     ADODataSet1.Post;
                     goto l3;
                end else
                   yd := ADODataSet1.FieldByName("wh_").AsInteger;
//             DataSource1.DataSet.Edit;
// ????? ? ????????? ?????? ???????? ??????
// ??????? ????? ?????????? ? ???????? ??????? ???????.
              if ADODataSet1.FieldByName("rf_").AsDateTime <= StrToDate(Edit1.Text) then
                begin
                     DataSource1.DataSet.Edit;
                     ADODataSet1.Delete;

                     ADODataSet1.Prior;
                     DataSource1.DataSet.Edit;
                     ADODataSet1.Post;
                end;
              if (ADODataSet1.FieldByName("rf_").AsDateTime >= StrToDate(Edit1.Text)) and (ADODataSet1.FieldByName("rf_").AsDateTime <= StrToDate(Edit2.Text)) then
                begin
                     if not ADODataSet1.FieldByName("re_").IsNull then
                       re := ADODataSet1.FieldByName("re_").AsInteger;
                     metka :=  ADODataSet1.GetBookmark;
//                      ADODataSet1.Next;
//                      while not ADOTable1.eof do
// ?????????? ???????? ?? ??????? ?????? ? ?????? ????????
l2:                       begin
l4:                            if ADODataSet1.Eof then
                                begin
                                     ADODataSet1.GotoBookmark(metka1);
                                     goto l1;
                                end;

                              ADODataSet1.Next;
                              if ADODataSet1.FieldByName("re_").IsNull then
                                 begin
                                      DataSource1.DataSet.Edit;
                                      ADODataSet1.Delete;
                                      goto l4;
                                 end else
                               if (ADODataSet1.FieldByName("re_").AsInteger = re) and (ADODataSet1.FieldByName("rf_").AsDateTime >= StrToDate(Edit1.Text)) and (ADODataSet1.FieldByName("rf_").AsDateTime <= StrToDate(Edit2.Text))and (ADODataSet1.FieldByName("wh_").AsInteger = yd) then
                                   begin
                                        DataSource1.DataSet.Edit;
                                        ADODataSet1.Delete;
                                        goto l4;
                                   end;
                               if (ADODataSet1.FieldByName("re_").AsInteger = re) and (ADODataSet1.FieldByName("rf_").AsDateTime < StrToDate(Edit1.Text)) and (ADODataSet1.FieldByName("wh_").AsInteger = yd) then
                                  begin
                                       DataSource1.DataSet.Edit;
                                       ADODataSet1.Prior;

                                       ADODataSet1.Next;
                                       metka1 := ADODataSet1.GetBookmark;
                                       ADODataSet1.Delete;
                                       ADODataSet1.GotoBookmark(metka1);
                                       ADODataSet1.FreeBookmark(metka1);
                                       i := 1;
                                       goto l4;
                                  end;
                               if ADODataSet1.FieldByName("wh_").AsInteger <> yd then
                                     begin

                                          ADODataSet1.GotoBookmark(metka);
                                          ADODataSet1.FreeBookmark(metka);

                                          goto l2;
                                     end;
                               i := 1;
                               ADODataSet1.next;
                         end;
                end;

l1:            ADODataSet1.next;
         end;
end;

Но здесь у меня были очень сильные тормоза и немог запомнить то что удалил.
Сейчас хочу попробовать ч/з ADOTable


 
janb   (2005-02-09 10:53) [17]

упс...


 
ЮЮ ©   (2005-02-09 10:54) [18]

Начнем с начала, где (в каком обработчике) стоит указанный в [1] код?


 
Scorpio ©   (2005-02-09 10:58) [19]

Да я хочу это все переделать по новому с учетом ADOTable, только когда я ее подключаю у меня ошибка выскакивает, этот кусок я исключил, думал что где то здесь, и попробовал, просто подключить чтобы активировать таблицу, и просто пробежаться по ее данным, а она мне сразу без пробега ошибку с типами, а потом повторно сразу запускаю и она пробег делает, как мне избежать эту ошибку с данными ??


 
Плохиш ©   (2005-02-09 10:58) [20]


>Scorpio ©   (09.02.05 10:51) [16]

8-O Нифига себе Та конструкция что сверху это вся моя программа

                     DataSource1.DataSet.Edit;
                    ADODataSet1.Delete;
                    DataSource1.DataSet.Edit;
                    ADODataSet1.Post;

Ой, что енто?


 
ЮЮ ©   (2005-02-09 11:02) [21]

вместо
 DataSource1.DataSet.Edit;
 ADODataSet1.Delete;
 DataSource1.DataSet.Edit;
 ADODataSet1.Post;

достаточно
 ADODataSet1.Delete;
при этом ADODataSet1.next не надо, т.к. текущей записью после этого станет следующая, если есть.

Source1.DataSet и ADODataSet1 - один и тот же набор данных?


 
Scorpio ©   (2005-02-09 11:02) [22]

DataSource1.DataSet.Edit; - перевод в рижим редактирования
АDODataSet1.Delete; - Удаление строки
DataSource1.DataSet.Edit;
ADODataSet1.Post; - запомнить для БД,

Но Post используетсмя для ADOTable, я думал что и для ADODataSet тоже проканает, а она нехочет, поэтому хочу сразу ч/з ADOTable произвести выборку.


 
Плохиш ©   (2005-02-09 11:03) [23]


>Scorpio ©   (09.02.05 10:58) [19]

Анекдот, про пьяного под фонарём напоминает :-(

PS. 11:00 московского времени, можно фа форуме больше не тусоваться :-(


 
Плохиш ©   (2005-02-09 11:04) [24]


>Scorpio ©   (09.02.05 11:02) [22]

Книжку бы чтоли какую почитал для начала :-(


 
Scorpio ©   (2005-02-09 11:08) [25]

Мне нужно прсто мою БД паодключить ч/з ADOTable чтобы небыло ошибок и все.


 
Scorpio ©   (2005-02-09 11:26) [26]

Тогда еще такой вопрос, почему если я подключаю базу через Table, а не ADOTable , то она мне ошибку невыдает??


 
msguns ©   (2005-02-09 11:32) [27]

>Scorpio ©   (09.02.05 10:51) [16]

Ух и наколбасил пацан ;))
Что-то подсказывает мне, что всю эту трахомудрию можно вполне впихнуть в полтора-два десятка строк кода.
Или вообще обойтись одним-двумя запросами


 
ЮЮ ©   (2005-02-09 11:32) [28]

Потому, что движок другой. БДЕ форева !!!


 
Scorpio ©   (2005-02-09 11:35) [29]

Но у меня проблема, моя БД находится не у меня на машине а у черта на куличках, как мне теперь быть??


 
msguns ©   (2005-02-09 11:39) [30]

И, главное, ни единой строки комментария. Видимо, предполагается, что каждый мало-мальски продвинутый джидай должен с молоком матери всосать, что обозначают эти таинственные wh_, rf_ и re_
А эти прыжки-перескоки из внутреннего цикла во внешний и поистине мастерское владение Next`ами, Prior`ами, Detet`ами и Insert`ами внутри сканирующего цикла напоминают Брюса Ли, не правда ли ?


 
ЮЮ ©   (2005-02-09 11:40) [31]

>как мне теперь быть??

Переходить на ADOCommand !!! :)
DELETE FROM table
WHERE
 (re_ IS NULL) OR
 (wh_ IS NULL) OR
 (re IN (1,30,34,37,41,42,44))

что ещё удалить?


 
msguns ©   (2005-02-09 11:41) [32]

>Scorpio ©   (09.02.05 11:35) [29]
> как мне теперь быть??

Немедленно бросать программить приложения с БД и "Учиться, учиться и учиться". Как говорил великий В.И.Ленин


 
msguns ©   (2005-02-09 11:44) [33]

>ЮЮ ©   (09.02.05 11:40) [31]
>Переходить на ADOCommand !!! :)

Ну да, как сиквел, так обязательно на адо ;))
Биде тоже его некисло понимает ;)
Тут трабла вовсе не в bde..


 
Scorpio ©   (2005-02-09 11:57) [34]

Смотри это мое условие:

 Есть БД поле wh_ - номера дел, в базе могут повторяться от двух до бесконечноти.
 поле re_ - решение к этому делу.
 поле rf_ - дата принятия решения

 Базу я отсортировал по номерам дел, и по дате принятия решений.
 
 Теперь мне нужно взять номер дела и проверить по базе со всеми его похожими номерами и сравнить было ли такое решение принято ранее и если было и оно невходит в отчетный период, (т.е. у меня есть диапазон дат по которым я смотрю rf_), то я его удаляю, также как и то что я нашел, т.е. в моей БД в итоге должно остаться дела решения которых ранее невстречальсь, они неповторялись, входили в отчетный период.


 
ЮЮ ©   (2005-02-09 12:07) [35]

DELETE FROM table
WHERE
NOT (rf_ BETWEEN :FirstDate AND :LastDate)

улалит все записи, не попадающие в "отчетный период", хотя очень странное обращение с записями, не боишься, что пользователь ошибется при задании периода и базе хана?

А есть поля, одназначно определяющее запись, в случае, если
wh_, re_ и rf_ в двух записях совпадают?


 
msguns ©   (2005-02-09 12:08) [36]

>Scorpio ©   (09.02.05 11:57) [34]

Сам-то понял, что написал ?
Что это за китайский иероглиф :
проверить по базе со всеми его похожими номерами ?

или это:
сравнить было ли такое решение принято ранее и если было и оно невходит в отчетный период, ?

Что с чем сравниваешь ? "Похожие" номера делов или дела с решениями ? Где тут котлеты, где мухи, а где тарелка ? ИМХО, все перемешано и свалено в одну большую кучу, откуда предполагается хлебать. Битое стекло пополам с дохлыми мухами.

Вердикт: база спроектирована не просто бездарно. Преступно. За такое надо сажать. Лет на 5-10. За статьи и учебники.
Причем срочно !


 
msguns ©   (2005-02-09 12:19) [37]

Что за манера все заталкивать в одну монстроидальную таблицу, гениально называемую таинственным словом "база" ?
А вот нельзя было по-нашему, по-бразильски ? Без этих восточных запремудростей:
1. Таблица дел. Содержит поля:
ID
номер вх.
номер исх.
дата
ссылка на документ-родитель (если их может быть несколько, то
 детал таблица с ID документов)
ФИО исполнителя
ФИО отв.лица (утвержд.подпись)
<всякая всячина о документе>

2. Таблица решений. Содержит поля:
ID
Дата решения
Дата срока исполнения
Код источника (комиссия, отдел, комитет и т.д.)
ФИО ответств. лица
список лиц, если была комиссия (обычный VARCHAR, но отображается как мемо для того, чтоб каждое ФИО было с новой строки)
<инфа о решении>
список ID документов, которых касается
список ID документов, на основании которых принято.

и т.д.
Схема примерная, конечно, я же не знаю что за "дела" тебе поручено учитывать. Что-то похожее на типичный контроль директивных документов в организации подобной какому-нить исполкому.
Но по схеме данных хотя бы можно понять, "кто на ком стоит"


 
Scorpio ©   (2005-02-09 12:22) [38]

Теперь мне нужно взять номер дела, его решение и дату и проверить по базе со всеми его похожими номерами дел и сравнить было ли такое решение принято ранее и если было и оно невходит в отчетный период, (т.е. у меня есть диапазон дат по которым я смотрю rf_), то я его удаляю, также как и то что я нашел, т.е. в моей БД в итоге должно остаться дела решения которых ранее невстречальсь, они неповторялись, входили в отчетный период.

Номер дела, номер решения, дата принятия в одной строке находятся.

А есть поля, одназначно определяющее запись, в случае, если
wh_, re_ и rf_ в двух записях совпадают?
Чтобы одновременно все три были похожи, токого небывает.

Базу в котоорой происходят удаления я формирую сам из 4 других, так что если неправильный диапазон дат мне нестрашен.


 
msguns ©   (2005-02-09 12:34) [39]

Ааа, ты все о своем, о женском. Посты не читаем, на предложения и замечания не реагируем.
Ну что ж, флаг в руки. И барабанные палочки. Вместо барабана можно по голове, ей не вредно будет
Счастливо побарабанить !


 
Scorpio ©   (2005-02-09 12:51) [40]

Я немогу понять что ты непонимаешь, там все просто, ч/з SQL запрос все правильно неудальшь, а чтобы построчно - я немогу подключить ADOTable.

А есть поля, одназначно определяющее запись, в случае, если
wh_, re_ и rf_ в двух записях совпадают?
- такого небывает.

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

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

Пример (период 01,01,2005 - 10,01,2005)
wh_   re_   rf_
204010001      4             8,01,2005
204010001      5             3,01,2005
204010001      4             30,12,2004
204020002      4             30,11,2004
204020002      3             5,10,2004
204030003      8             8,01,2005
204030003      6             7,01,2005

Должно остаться:
204010001      5              3,01,2005
204030003      8              8,01,2005
204030003      6              7,01,2005



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

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

Наверх





Память: 0.6 MB
Время: 0.098 c
1-1109514326
zep
2005-02-27 17:25
2005.03.13
Image


4-1106898466
Jetus
2005-01-28 10:47
2005.03.13
Получение результатов выполнения командной строки


6-1104903666
uny
2005-01-05 08:41
2005.03.13
ping каждые 2 минуты - спец маленькая прога


1-1109396807
Dr. Genius
2005-02-26 08:46
2005.03.13
Была ли зарезервирована (хот кей) определенная клавиша


9-1103402156
Goldseeker
2004-12-18 23:35
2005.03.13
Опять столкновения





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