| 
| 
 | Вопрос # 5 179/ вопрос открыт / | 
 |  Приветствую, уважаемые эксперты!Хочу чтобы изменялась дата на год назад использую функцию IncYear. В строке myDate := IncYear(myDate, -1); выдает ошибку [Error] Unit1.pas(88): Too many actual parameters. Подскажите как исправить пожалуйста.
 Приложение:Переключить в обычный режим function TForm1.IncYear(const StartDate: TDateTime): TDateTime;var  myDate : TDateTime;begin   myDate := EncodeDate(2008, 02, 29);  ShowMessage('myDate = '+DateToStr(myDate));    myDate := IncYear(myDate, -1);  ShowMessage('myDate - 1 years = '+DateToStr(myDate)); end;
|  |   Вопрос задал: mobidik (статус: Посетитель)Вопрос отправлен: 12 апреля 2011, 04:27
 Состояние вопроса: открыт, ответов: 2.
 |  Ответ #1. Отвечает эксперт: Мережников Андрей Здравствуйте, mobidik!Ошибка в том, что свою функцию назвали так же, как встроенная IncYear. Назовите ее, например, MyIncYear.
 
|  | Ответ отправил: Мережников Андрей (статус: Абитуриент)Время отправки: 12 апреля 2011, 06:05
 
 |  Ответ #2. Отвечает эксперт: Вадим К Здравствуйте, mobidik!Функция IncYear не может уменьшать дату. Только увеличивать. В справке сказано - DecYear нет, используйте IncMinute с  отрицательным значением.
 Я бы написал эту функцию где то так.
 
 var
  myDate : TDateTime;
  myYear, myMonth, myDay : Word;
begin
  myDate := now();// для примера.
  DecodeDate(myDate, myYear, myMonth, myDay);// разобрали на кусочки
  dec(myYear);
  // проверим, что новый год высокосный
  if not ((myYear mod 4 = 0) and (myYear mod 100 <> 0)) and (myDays = 29) and (myMonth = 2) then begin
    // в этом случае если дата 29 февраля - выставим 1 марта. Хотя может кому то правильнее 28 февраля выставить...
    myDay := 1; myMonth := 3;
  end;
  myDate := EncodeDate(myYear, myMonth, myDay);
|  | Ответ отправил: Вадим К (статус: Академик)Время отправки: 12 апреля 2011, 10:48
 
 |  
 Мини-форум вопросаВсего сообщений: 10; последнее сообщение — 14 апреля 2011, 04:42; участников в обсуждении: 6. 
|   | min@y™ (статус: Доктор наук), 12 апреля 2011, 08:10 [#1]: Цитата (Мережников Андрей): Назовите ее, например, MyIncYear. Ну, необязательно. Можно так:
 
 myDate := DateUtils.IncYear(myDate, -1); Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп! |  
|   | bugmenot (статус: 3-ий класс), 12 апреля 2011, 09:00 [#2]:Хм, по-моему, обёртка вообще ничего не делает... виконання програми розпочинається з того самого мiсця, де призупинилося.
 
 |  
|   | Мережников Андрей (статус: Абитуриент), 12 апреля 2011, 18:52 [#3]: Цитата (Вадим К): Функция IncYear не может уменьшать дату вот выдержка из справки:
 IncYear returns the value of the AValue parameter, incremented by ANumberOfYears years. ANumberOfYears can be negative, to return a date N years previous.
 Если значение отрицательное, то возвращается дата на N лет предшествующая.
 can be negative - переводится как: может быть отрицательная.
 Может у нас Delphi разная? У меня TurboDelphi
 |  
|   | Вадим К (статус: Академик), 12 апреля 2011, 18:57 [#4]:я смотрел справку по старым делфи. А английский я знаю   Галочка "подтверждения прочтения" - вселенское зло. |  
|   | Мережников Андрей (статус: Абитуриент), 12 апреля 2011, 19:35 [#5]: Цитата (Вадим К): А английский я знаю Не сомневаюсь в этом
  
 Цитата (Вадим К): я смотрел справку по старым делфи Я так и предположил:
 
 Цитата (Мережников Андрей): Может у нас Delphi разная? У меня TurboDelphi |  
|   | min@y™ (статус: Доктор наук), 12 апреля 2011, 20:36 [#6]: Цитата (Вадим К): я смотрел справку по старым делфи. Интересно, справку от какой версии ты смотрел?
 Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп! |  
|   | mobidik (статус: Посетитель), 13 апреля 2011, 03:21 [#7]:Спасибо большое за ответы. Подскажите пожалуйста что не так делаю? Необходимо чтобы программа при выборе периода (даты) выводила в таблицу сумму рублей за выбранный период даты в первое поле, и еще минус месяц и минус год во второе поле. Вот код:
 
 unit Unit1;
 
interface
 
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ComCtrls, Grids, ExtCtrls, DBGrids, ComObj, DB, ADODB, DateUtils;
 
type
  TForm1 = class(TForm)
    Edit1: TEdit;
    DateTimePicker1: TDateTimePicker;
    DateTimePicker2: TDateTimePicker;
    Button1: TButton;
    Label1: TLabel;
    Label2: TLabel;
    Label3: TLabel;
    dbs: TADOConnection;
    query: TADOQuery;
    DataSource1: TDataSource;
    StringGrid1: TStringGrid;
    Label4: TLabel;
    Label5: TLabel;
    procedure Button1Click(Sender: TObject);
  private
  function ZedYear ( const StartDate : TDateTime {; NumberOfYears : Integer = 1} ) : TDateTime;
  function ZedMonth ( const StartDate : TDateTime {; NumberOfMonths : Integer = 1} ) : TDateTime;
    { Private declarations }
  public
    { Public declarations }
  end;
 
var
  Form1: TForm1;
 
implementation
 
{$R *.dfm}
 
procedure TForm1.Button1Click(Sender: TObject);
var i,j:integer;
begin
dbs.close;
query.close;
query.SQL.Text:= 'SELECT sum(doc_summ) FROM doc WHERE (doc_date between :d1 and :d2 )';
query.Parameters.ParseSQL(query.SQL.Text, true);
query.Parameters.ParamByName('d1').Value:=DateTimePicker1.Date;
query.Parameters.ParamByName('d2').Value:=DateTimePicker2.Date;
query.Open;
 
 
query.Close;
query.SQL.Text:= 'SELECT sum(doc_summ) FROM doc WHERE (doc_date between :d1 and :d2 )';
query.Parameters.ParseSQL(query.SQL.Text, true);
query.Parameters.ParamByName('d1').Value:=ZedYear(ZedMonth(DateTimePicker1.Date));
query.Parameters.ParamByName('d2').Value:=ZedYear(ZedMonth(DateTimePicker2.Date));
query.Open;
i:=0;
 
while not query.Eof do
begin
inc(i);
StringGrid1.Cells[0,i]:=query.Fields[0].AsString+' '+query.Fields[1].AsString+' '+query.Fields[2].AsString;
for j:=1 to 2 do
StringGrid1.Cells[j,i]:=query.Fields[j+2].AsString;
StringGrid1.RowCount:=i+1;
query.Next;
end;
if i=0 then begin
StringGrid1.RowCount:=2;
StringGrid1.Cells[0,1]:='';
StringGrid1.Cells[1,1]:='';
StringGrid1.FixedRows:=1;
 
end;
end;
function TForm1.ZedYear(const StartDate: TDateTime): TDateTime;
var
  myDate : TDateTime;
begin
 
  myDate := EncodeDate(2008, 02, 29);
  ShowMessage('myDate = '+DateToStr(myDate));
 
 
  myDate := IncYear(MyDate, -1);
  ShowMessage('myDate - 1 years = '+DateToStr(myDate));
 
end;
 
function TForm1.ZedMonth(const StartDate: TDateTime): TDateTime;
var
  myDat : TDateTime;
begin
  myDat := StrToDate('31.01.2000');
  ShowMessage('myDat = '+DateToStr(myDat));
 
  myDat := IncMonth(myDat);
  ShowMessage('myDat - 1 month = '+DateToStr(myDat));
end;
end.Как переделать функции - год и - месяц, а то мне выдает в отдельном окне MyDate = 31.01.2000 ?
 |  
|   | Мережников Андрей (статус: Абитуриент), 13 апреля 2011, 06:01 [#8]: Цитата (mobidik): Как переделать функции - год и - месяц, а то мне выдает в отдельном окне MyDate = 31.01.2000 ?  1.в обеих функциях добавить строку:
 Result:=MyDat;
 2. в функции ZedMonth исправить строку myDat := IncMonth(myDat);
 на myDat := IncMonth(myDat,-1);
 
 переменную MyDat в обеих функциях можно выбросить совсем, вместо нее использовать Result;
 
 Вообще, это уже новый вопрос и задавать его надо было отдельно.
 |  13 апреля 2011, 11:10: Вопрос перемещён из тематического раздела Delphi » Общие вопросы по программированию в раздел Delphi » Алгоритмы, преобразования модератором Ерёмин А.А. 
|   | mobidik (статус: Посетитель), 14 апреля 2011, 03:38 [#9]:Вот так вставил все равно выходит окошко с датой: 
 function TForm1.ZedYear(const StartDate: TDateTime): TDateTime;
var
  myDate : TDateTime;
begin
  Result:= MyDate;
  myDate := EncodeDate(2008, 02, 29);
  ShowMessage('myDate = '+DateToStr(myDate));
 
 
  myDate := IncYear(MyDate, -1);
  ShowMessage('myDate - 1 years = '+DateToStr(myDate));
 
end;
 
function TForm1.ZedMonth(const StartDate: TDateTime): TDateTime;
var
 
  myDat : TDateTime;
begin
Result:= MyDat;
  myDat := StrToDate('31.01.2000');
  ShowMessage('myDat = '+DateToStr(myDat));
 
  myDat := IncMonth(myDat,-1);
  ShowMessage('myDat - 1 month = '+DateToStr(myDat));
 
end;
end. |  
|   | Егор (статус: 10-ый класс), 14 апреля 2011, 04:42 [#10]:блин, и этот человек занимается программированием баз данных?! я бы понял такие ошибки у новичка.
 автору вопроса - срочно учить программирование. вообще - программирование. основы алгоритмов или подобные курсы/предметы. ну или уйти в другую область, т.к. напрочь отсутствует логическое мышление и понимание.
 
 function TForm1.ZedYear(const StartDate: TDateTime): TDateTime;
                              // гм. а зачем нам этот дурацкий параметр StartDate?
                              // мы же его всё равно не используем нигде и никогда
var
  myDate : TDateTime;
begin
  Result:= MyDate;  // ай, маладца! в результат, возвращаемый функцией, пишем значение
                    // неинициализированной переменной, т.е. мусор
  myDate := EncodeDate(2008, 02, 29);
  ShowMessage('myDate = '+DateToStr(myDate));
 
  myDate := IncYear(MyDate, -1);
  ShowMessage('myDate - 1 years = '+DateToStr(myDate));
  // упс. а где же здесь Result? это что же, всё, что мы делали после строчки Result:= MyDate;,
  // оно всё зря, что ли? выходит, зря.
end;или я всё-всё неправильно понял и на самом деле проблема в этом:
 
 Цитата (mobidik): все равно выходит окошко с датойа? ну тогда, чтобы "окошко с датой" не выходило, нужно убрать ShowMessage
 Опасайтесь багов в приведенном выше коде; я только доказал корректность, но не запускал его.— Donald E. Knuth.
 |  Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте. |