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

Вниз

Вопросы по экспорту и базам данных   Найти похожие ветки 

 
Defort ©   (2006-11-19 22:10) [0]

Добрый вечер, господа. Как-то (может кто помнит), меня тут послали, так как посчитали мое знание баз недостаточном, чтобы считать меня достойным разговора. Но с базами, почитав книжку, я разобрался. Теперь у меня новые вопросы:

Вопрос первый.

Мне нужно, чтобы автоматически формировалась таблица График платежей (то есть в течении всего периода действия договора - с начального по конечную дату - каждый первый день месяца производился платеж). Я пытался сначала разбить по дате, потом сосчитать количество строк, поделить на нее всю сумму и разместить по строкам (надеюсь понятно объяснил). У меня никак не получается это сделать. Вообще. Может кто поможет? о_О

Вопрос 2: по экспорту в Эксель. Все работает, но только номер договора он рассматривает как вариантный тип (то есть если я пишу номер 02.03 - он рассматривает как дату, если 17 - как число). Это не есть хорошо, так как я говорю ему рассматривать как строку. Вот мой код:

Sheet.Cells[index,1]:=DataModule1.ADOTable1.Fields.Fields[1].AsString;

Не подскажете, в чем может быть ошибка?

Заранее всех благодарю!


 
EvS ©   (2006-11-19 23:09) [1]

> Как-то (может кто помнит), меня тут послали

Тут таких не меряно.

> Вопрос первый.

Причем здесь строки,посчитай кол-во месяцев и дели.
Показывай что делал.

> Вопрос 2

Форматировать нужно ячейки Экселя.


 
Sergey13 ©   (2006-11-20 08:37) [2]

> Вопрос первый.
> надеюсь понятно объяснил
Не особо.
Если платеж проходит автоматически (в чем я лично сомневаюсь), то почему бы каждое первое число не запускать процедуру, где на каждый договор вводить 1 запись с датой и уммой платежа, равной остатку/количество оставшихся месяцев.


 
Defort ©   (2006-11-20 19:24) [3]

2EvS
Показываю что деле, только плиз не смеятся. Здесь я пытался сделать только чтобы появилась много строк с отличающимися на 30 дней датами, так как не знаю как сделать, чтобы период разбивался именно по первому дню месяца.

var days, i:integer; {ñ÷åò÷èê äëÿ öèêëà}
   summ: real; //ïåðåìåííûå äëÿ çàïîëåíèÿ àâòîìàòè÷åñêè
   days2: variant;
begin
if SubKindRadioGroup.ItemIndex=0 then
   days2:=DataModule1.ADOTable1.FieldValues["Äàòà çàêëþ÷åíèÿ"]+30;
   while days2<DataModule1.ADOTable1.FieldValues["&#196;&#224;&#242;&#224; &#231;&#224;&#234;&#240;&#251;&#242;&#232;&#255;"] do
     begin
       DataModule1.ADOTable3.Insert;
       DataModule1.ADOTable3.FieldValues["&#196;&#224;&#242;&#224; &#239;&#235;&#224;&#242;&#229;&#230;&#224;"]:=days;
       {DataModule1.ADOTable3.FieldValues["&#209;&#243;&#236;&#236;&#224; &#239;&#235;&#224;&#242;&#229;&#230;&#224;"]:=summ;
       DataModule1.ADOTable3.FieldValues["&#207;&#238;&#227;&#224;&#248;&#229;&#237;"]: =false;
       DataModule1.ADOTable3.FieldValues["&#207;&#229;&#237;&#232;"]:=0;
       DataModule1.ADOTable3.FieldValues["&#206;&#241;&#242;&#224;&#242;&#238;&#234;"]: =summ;
       DataModule1.ADOTable3.Post;
       days:=days+30;
     end;

Часть закомментено, так как как говорилось раньше пока я пытался лишь создать строки с заполенными датами.

По поводу второго вопроса. Как быть то? Можно форматировать нужно ячейки Экселя из Делфи? о_О

Спасибо за ответы


 
Anatoly Podgoretsky ©   (2006-11-20 19:44) [4]

> Defort  (20.11.2006 19:24:03)  [3]

В месяце не обязательно 30 дней

EncodeDate, IncMonth


 
Defort ©   (2006-11-20 20:20) [5]

В таком виде программу вообще циклит:

var i:integer; {счетчик для цикла}
   summ: real; //переменные для заполения автоматически
   days: variant;
begin
 if SubKind.ItemIndex=0 then
   days:=DataModule1.ADOTable1.FieldValues["Дата заключения"];
   IncMonth(days);
   while days<DataModule1.ADOTable1.FieldValues["Дата закрытия"] do
     begin
       DataModule1.ADOTable3.Append;
       DataModule1.ADOTable3.FieldValues["Дата платежа"]:=days;
       {DataModule1.ADOTable3.FieldValues["Сумма платежа"]:=summ;
       DataModule1.ADOTable3.FieldValues["Погашен"]:=false;
       DataModule1.ADOTable3.FieldValues["Пени"]:=0;
       DataModule1.ADOTable3.FieldValues["Остаток"]:=summ;
       Application.MessageBox(PCHar("График платежей создан. Проверьте его правильность и отредактируйте поля в случае надобности"), "Внимание!", MB_OK); //Выводится ошибка на экран}
       DataModule1.ADOTable3.Post;
       IncMonth(days);
     end;
end;


:(


 
Sam Stone ©   (2006-11-20 21:30) [6]

> [5] Defort ©   (20.11.06 20:20)

Читаем описание IncMonth до просветления.


 
Anatoly Podgoretsky ©   (2006-11-20 23:04) [7]

> Defort  (20.11.2006 20:20:05)  [5]

Решение не соответсвует постановке, а для чего я тебе список функций приводил? Для того, чтобы ты их внимательно посмотрел.
Можешь к ним добавить еще две - DecodeDate и :=


 
Defort ©   (2006-11-23 22:56) [8]

Вроде с датой разобрался, теперь не глют по крайней мере. Но и не добавляет.

procedure TNewGraphForm.SubKindClick(Sender: TObject);
var i:integer;
   summ: real;
   days, days2: variant;  //начальная и конечная даты
   AYear, AMonth, ADay, AYear2, AMonth2, ADay2: Word; //для раскодировки
   m: integer;

begin
 if SubKind.ItemIndex=0 then
   days:=DataModule1.ADOTable1.FieldValues["Дата заключения"];
   days2:=DataModule1.ADOTable1.FieldValues["Дата закрытия"];

   DecodeDate(days, AYear, AMonth, ADay); Inc(AMonth);
   DecodeDate(days2, AYear2, AMonth2, ADay2);
   while (AMonth<AMonth2) and(AYear<=AYear2) do
     begin
       DataModule1.ADOTable3.Insert;  //по задумке добавление новой строки
       DataModule1.ADOTable3.FieldValues["Дата платежа"]:=EncodeDate(AYear, AMonth, ADay);//присваиваение полю Дата платежа текущей даты
       DataModule1.ADOTable3.Post; //по задумке принятие изменений
       Inc(AMonth);
     end;
end;


Вопрос собственно как правильно добавить новые строки. Сенкс.


 
Kolan ©   (2006-11-23 23:00) [9]

> Вопрос собственно как правильно добавить новые строки

Запрос сделать:
INSERT INTO <Table> ...
Или вопрос не в этом?


 
Defort ©   (2006-11-24 20:33) [10]


> апрос сделать:
> INSERT INTO <Table> ...
> Или вопрос не в этом?


Это язык SQL? Я не учил его еще. Буду благодарен за примерный код


 
Defort ©   (2006-11-24 20:40) [11]

Да, кстати, и с датами правильно сделано?


 
Sam Stone ©   (2006-11-24 20:47) [12]

> Это язык SQL? Я не учил его еще. Буду благодарен за примерный
> код

учи http://cs.ifmo.ru/education/documentation/sql_kg/

> Да, кстати, и с датами правильно сделано?

зачем разбирать дату, а затем снова собирать ее?

> не добавляет

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


 
Defort ©   (2006-11-24 22:27) [13]


> зачем разбирать дату, а затем снова собирать ее?

Когда я писал IncMonth(days) у меня циклило (days - дата) - посмотри на условие  цикла - может оно неправильно


> какая база?


MS Access


 
Sam Stone ©   (2006-11-24 22:36) [14]

> [13] Defort ©   (24.11.06 22:27)

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


> Когда я писал IncMonth(days) у меня циклило (days - дата)

[6]
надо лучше курить справку. Для TDateTime IncMonth это функция, поэтому правильно будет days:=IncMonth(days);


 
Anatoly Podgoretsky ©   (2006-11-24 22:39) [15]

С датами не вполне правильно.
Для начало разборка и сборка нужны только для получения первого числа месяца.
Decode(StartDate, Y, M, D);
StartDate := EnCode(Y, M, 1);  // первое число текущего месяца
// месяц скоректировать, прибавить 1 или 2, что бы со следующего
// IncMonth

Тоже для конечной даты или еще лучше количество месяцев, что и проще и правильнее. Если можно ввести понятие количество платежей
После того как начало конец сформированы, цикл совсем простой.

while StartDate <= EndDate
  операции
  IncMonth
end;

С количеством платежей еще проще
for I := 1 to PayCount do begin
  операции
  IncMonth
end;


 
Anatoly Podgoretsky ©   (2006-11-24 22:42) [16]

Правильно ли будет, если текущая дата 30.11.2006, чтобы первый платеж был 1.12.2006?


 
Sam Stone ©   (2006-11-24 23:15) [17]

> [15] Anatoly Podgoretsky ©   (24.11.06 22:42)

А не удобнее ли будет использование StartOfTheDay/Week/Month/Year, EndOfTheDay, IncDay, IncMonth и прочих?
Например, первый день следующего месяца IncSecond(EndOfTheMonth(Now)).


 
Defort ©   (2006-11-24 23:18) [18]

2Anatoly Podgoretsky - огромное спасибо. На таких простых примерах мне все понятно!


> Правильно ли будет, если текущая дата 30.11.2006, чтобы
> первый платеж был 1.12.2006?


В принципе да. Я этими вопросами вообще не заведую, нужно будет у бизнес-консультанта спросить.

Если не трудно, не можешь написать как правильно вставить строки не используя SQL?


 
Anatoly Podgoretsky ©   (2006-11-24 23:31) [19]

> Sam Stone  (24.11.2006 23:15:17)  [17]

Не стал бы так рисковать IncSecond(EndOfTheMonth(Now)).
по двум причинам
1. не является круглой датой
2. результат тоже не круглая дата

Есть StartOfTheMonth и IncMonth - вот это более подходит.
Является аналогом Trunc, Day=1, IncMonth


 
Sam Stone ©   (2006-11-24 23:39) [20]

> [19] Anatoly Podgoretsky ©   (24.11.06 23:31)

Что есть "круглая дата"? Первая миллисекунда дня/месяца года? (т.е. дробная часть = 0)?


> Есть StartOfTheMonth и IncMonth - вот это более подходит

тут да, сплоховал я что-то ) StartOfTheMonth(IncMonth(дата)) :))


> как правильно вставить строки не используя SQL?

можно поинтересоваться, чем же так SQL не нравится? :)


 
Anatoly Podgoretsky ©   (2006-11-24 23:42) [21]

> Defort  (24.11.2006 23:18:18)  [18]

> как правильно вставить строки не используя SQL?

Вот это уже само не правильно,
но строка вставляется как .Append и присвоение значений полям, по окончанию Post


 
Anatoly Podgoretsky ©   (2006-11-24 23:43) [22]

> Sam Stone  (24.11.2006 23:39:20)  [20]

Вот это уже красиво, а значит правильно.


 
Defort ©   (2006-11-25 11:24) [23]


> можно поинтересоваться, чем же так SQL не нравится? :)


Не хочется тратить времени на его изучения, хотя учить его все равно придется - я планирую делать клиент-серверную программу.


> но строка вставляется как .Append и присвоение значений
> полям, по окончанию Post


Пробовал так, у меня циклило. Видимо где-то снова скривил. Буду разбираться! Спасибо!


 
Defort ©   (2006-11-25 12:26) [24]

Ох. Что то не получается никак. Пишу код:

procedure TNewGraphForm.SubKindClick(Sender: TObject);
var i:integer;
   summ: real;
   days, days2: variant;  //&#237;&#224;&#247;&#224;&#235;&#252;&#237;&#224;&#255; &#232; &#234;&#238;&#237;&#229;&#247;&#237;&#224;&#255; &#228;&#224;&#242;&#251;
   m: integer;

begin
 if SubKind.ItemIndex=0 then
   days:=DataModule1.ADOTable1.FieldValues["&#196;&#224;&#242;&#224; &#231;&#224;&#234;&#235;&#254;&#247;&#229;&#237;&#232;&#255;"];
   days2:=DataModule1.ADOTable1.FieldValues["&#196;&#224;&#242;&#224; &#231;&#224;&#234;&#240;&#251;&#242;&#232;&#255;"];
   days:=IncMonth(days);
   FormatDateTime("dddddd", days);
   FormatDateTime("dddddd", days2);
   while days<days2 do
     begin
       DataModule1.ADOTable3.Append;  //&#239;&#238; &#231;&#224;&#228;&#243;&#236;&#234;&#229; &#228;&#238;&#225;&#224;&#226;&#235;&#229;&#237;&#232;&#229; &#237;&#238;&#226;&#238;&#233; &#241;&#242;&#240;&#238;&#234;&#232;
       DataModule1.ADOTable3.FieldValues["&#196;&#224;&#242;&#224; &#239;&#235;&#224;&#242;&#229;&#230;&#224;"]:=days;//&#239;&#240;&#232;&#241;&#226;&#224;&#232;&#226;&#224;&#229;&#237;&#232;&#229; &#239;&#238;&#235;&#254; &#196;&#224;&#242;&#224; &#239;&#235;&#224;&#242;&#229;&#230;&#224; &#242;&#229;&#234;&#243;&#249;&#229;&#233; &#228;&#224;&#242;&#251;
       days:=IncMonth(days);
     end;
     DataModule1.ADOTable3.Post;
end;


Не вставляет ни в какую строки. (Команду Post пробовал в ключить и в цикл - все равно не вставляет).

Кто может помочь разобраться с добавлением записи?


 
Sam Stone ©   (2006-11-25 14:00) [25]

во-первых, почему дата вариантом? Оно конечно универсальное... )
во-вторых, проверь, есть ли у тебя вхождение в цикл.

> Не хочется тратить времени на его изучения, хотя учить его
> все равно придется

начинай учить прям щас. Язык легкий, простые запросы через пару дней освоишь, остальное из практики придет.

> Пробовал так, у меня циклило.

пост ни при каких условиях не отвечает за выход из цикла. Тут тебе F8 в помощь.


 
Defort ©   (2006-11-26 13:42) [26]

Трассировку делать пробовал, вхождение в цикл есть. И выход есть. Но, зараза не добавляет! Я не представляю почему. По сути, Append добавляет запись в конец таблицы. После этой команды я у созданной записи меняю значение даты платежа. Потом (по идее), идет команда Post - принимаем изменение и после этого снова Append - еще одна запись.  

Логически, по такой схеме должно работать! Где, блин, ошибка?


 
Anatoly Podgoretsky ©   (2006-11-26 16:54) [27]

> Defort  (26.11.2006 13:42:26)  [26]

> Где, блин, ошибка?

В коде.


 
Defort ©   (2006-11-26 18:02) [28]


> В коде.

Ну это-то я понял и сам ;) Конкретно место не укажешь?


 
Anatoly Podgoretsky ©   (2006-11-26 18:11) [29]

> Defort  (26.11.2006 18:02:28)  [28]

В твоем, в моем коде все работает.
А что в твоем мне не видно.


 
Defort ©   (2006-11-26 20:56) [30]


> В твоем, в моем коде все работает.
> А что в твоем мне не видно.

Елки-палки. Ты говоришь загадками! т.е. ты не видишь ошибку?


 
Sam Stone ©   (2006-11-26 21:04) [31]

> [30] Defort ©   (26.11.06 20:56)

TADOQuery.close;
TADOQuery.sql.text:="insert into mytable(datefield)values(:datevar)";
TADOQuery.Parameters.ParseSQL(TADOQuery.sql.text,true);
TADOQuery.PArameters.PAramValues["datevar"]:=now;
TADOQuery.execSQL;


 
Anatoly Podgoretsky ©   (2006-11-26 22:03) [32]

> Defort  (26.11.2006 20:56:30)  [30]

А где я ее должен увидеть?


 
Defort ©   (2006-11-26 22:06) [33]

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

Я попытался исправить сей казус, но безуспешно :(

Пишу

DataModule1.ADOTable3.Insert;        DataModule1.ADOTable3.FieldValues["LinkKey"]:=DataModule1.ADOTable1.FieldValues[ "Key1"];

Но LinkKey"ю ничего не присваевается(



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

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

Наверх





Память: 0.55 MB
Время: 0.039 c
15-1163785390
[_]
2006-11-17 20:43
2006.12.10
Шифрование открыто-закрытым ключом.


15-1163675742
ArtemESC
2006-11-16 14:15
2006.12.10
На речке, на речке, на том бережо--ооочке...


15-1164271599
wamp
2006-11-23 11:46
2006.12.10
cmd


2-1164123200
Уважаемый Ламер
2006-11-21 18:33
2006.12.10
Запись данных в таблицу


4-1154450987
Destroyer
2006-08-01 20:49
2006.12.10
Ключ HKEY_USERS





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