Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.12.10;
Скачать: CL | DM;

Вниз

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

 
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;
Скачать: CL | DM;

Наверх




Память: 0.57 MB
Время: 0.049 c
9-1139701704
Bogdan1024
2006-02-12 02:48
2006.12.10
Armed Man v1.07 Last Call


15-1164196964
Rbn
2006-11-22 15:02
2006.12.10
MS SQL шифровать


15-1164011476
Gavrila
2006-11-20 11:31
2006.12.10
TTreeView: как правильно использовать метод AddObject?


3-1159778962
Dima L
2006-10-02 12:49
2006.12.10
Access и AdoTable


2-1164256385
denand
2006-11-23 07:33
2006.12.10
Про иконки в Tlistview