Форум: "Начинающим";
Текущий архив: 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["Äàòà çàêðûòèÿ"] do
begin
DataModule1.ADOTable3.Insert;
DataModule1.ADOTable3.FieldValues["Äàòà ïëàòåæà"]:=days;
{DataModule1.ADOTable3.FieldValues["Ñóììà ïëàòåæà"]:=summ;
DataModule1.ADOTable3.FieldValues["Ïîãàøåí"]: =false;
DataModule1.ADOTable3.FieldValues["Ïåíè"]:=0;
DataModule1.ADOTable3.FieldValues["Îñòàòîê"]: =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; //íà÷àëüíàÿ è êîíå÷íàÿ äàòû
m: integer;
begin
if SubKind.ItemIndex=0 then
days:=DataModule1.ADOTable1.FieldValues["Äàòà çàêëþ÷åíèÿ"];
days2:=DataModule1.ADOTable1.FieldValues["Äàòà çàêðûòèÿ"];
days:=IncMonth(days);
FormatDateTime("dddddd", days);
FormatDateTime("dddddd", days2);
while days<days2 do
begin
DataModule1.ADOTable3.Append; //ïî çàäóìêå äîáàâëåíèå íîâîé ñòðîêè
DataModule1.ADOTable3.FieldValues["Äàòà ïëàòåæà"]:=days;//ïðèñâàèâàåíèå ïîëþ Äàòà ïëàòåæà òåêóùåé äàòû
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.04 c