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

Вниз

Help me pls   Найти похожие ветки 

 
begg   (2006-11-14 06:53) [0]

Здравствуйте!

Я думаю мой вопрос покажется вам тривиальным.
Суть проблемы: есть список дат с суммами остатков:

Список "ДО"
16/10/2006 84839.88
19/10/2006 50489.51
20/10/2006 85947.16
23/10/2006 64422.83
24/10/2006 81672.14
26/10/2006 25049.58
27/10/2006 27391.66
03/11/2006 3868.98
10/11/2006 332.98

необходимо сформировать новый список
заполнив промежутки между датами(сумма остатка берется за вторую дату,те
в промежутке между 16/10/2006 и 17/10/2006 сумма остатка  для 17/10/2006 и 17/10/2006
берется за 19/10/2006!

т.е. следующее:

Список "ПОСЛЕ"
16/10/2006 84839.88
17/10/2006 50489.51 +
18/10/2006 50489.51 +
19/10/2006 50489.51
20/10/2006 85947.16
21/10/2006 64422.83 +
22/10/2006 64422.83 +
23/10/2006 64422.83
24/10/2006 81672.14
25/10/2006 25049.58 +
26/10/2006 25049.58
27/10/2006 27391.66
28/11/2006 3868.98  +
29/11/2006 3868.98  +
...                      +
03/11/2006 3868.98
04/11/2006 332.98   +
05/11/2006 332.98   +
...                      +
10/11/2006 332.98

Я вот написал код но список местами не правильно формируется:(

В StringGrid1 - Список "ДО"
В StringGrid2 - помещается список "ПОСЛЕ" :)

var
 Form1: TForm1;
 g_SrcLineCount:Integer; //число строк в StringGrid1

...
//Функции для извлечения данных из StringGrid1
function getSrcDate(i:Integer):TDate;
begin
   Result:=StrToDate(Form1.StringGrid1.Cells[1,i]);
end;

function getSrcCash(i:Integer):Double;
begin
   Result:=StrToFloat(Form1.StringGrid1.Cells[2,i]);
end;

function getSrcDateStr(i:Integer):String;
begin
   Result:=Form1.StringGrid1.Cells[1,i];
end;

function getSrcCashStr(i:Integer):String;
begin
   Result:=Form1.StringGrid1.Cells[2,i];
end;

//процедура для занесения новой записи в StringGrid2
procedure putNewRecord(num:Integer; sdate:string; scash:string);
begin
   Form1.StringGrid2.Cells[0,num]:=sdate);
   Form1.StringGrid2.Cells[1,num]:=scash);
end;

// функция для вычисления количества дней между двумя датами
function getSubDate(dRight:TDate; dLeft:TDate):Integer;
begin
   Result:=Trunc(dRight) - Trunc(dLeft);
end;

...

procedure TForm1.Button1Click(Sender: TObject);
var
   NewDateList: TStrings;
   NewCashList: TStrings;
   tmpdate    : TDate;
   nRaznica   : Integer;
   i,j        : Integer;  
begin

   {
    Почему использую списки а не сразу пишу в стрингрид2?
    ...нужно для дальнейшей работы:)
   }
   NewDateList:= TStringList.Create;
   NewCashList:= TStringList.Create;

   FOR i:=1 TO g_SrcLineCount DO
   BEGIN
       if(i<g_SrcLineCount)then
       begin
                   nRaznica := getSubDate(getSrcDate(i+1),getSrcDate(i));
                   tmpdate  := getSrcDate(i);
                   if(nRaznica = 1)then
                   begin
                           
      NewDateList.Add(getSrcDateStr(i));
                           NewCashList.Add(getSrcCashStr(i));
                   end
                   else
                   if(nRaznica>1)then
                   begin
                           NewDateList.Add(getSrcDateStr(i));
                           NewCashList.Add(getSrcCashStr(i));

                           for j:=1 to nRaznica-1 do
                           begin
                               tmpdate:=IncDay(tmpdate);
                               NewDateList.Add(DateToStr(tmpdate));
                               NewCashList.Add(getSrcCashStr(i+1));
                           end;
                   end;
       end;

       if(i = g_SrcLineCount) then
       begin
           tmpdate:=IncDay(tmpdate);
           NewDateList.Add(DateToStr(tmpdate));
           NewCashList.Add(getSrcCashStr(i-1));
       end;
   END;

   //заполнение StringGrid2
   for j:=0 to (NewDateList.Count-1) do
       putNewRecord(j+1,SrcDateList.Strings[j],SrsCashList.Strings[j]);
end;

Проблема в том что иногда добавляются записи
у которых сумма берется не за "правую" границу диапазона а за левую..??
([дд/мм/гг]...[дд/мм/гг]"правая"..ну Вы поняли меня)

Не могли бы вы посмотреть и сказать что тут не так...или предложить свое решение:)

Задача-то тривиальная ..но вот ошибку(логическую) пока поймать не могу...и времени в обрез...

СПАСИБО ЗАРАНЕЕ!!!


 
KilkennyCat ©   (2006-11-14 08:09) [1]

намного проще сделать наоборот, например: от 10/11/2006 до 16/10/2006



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

Текущий архив: 2006.12.03;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.033 c
2-1163273365
(_)
2006-11-11 22:29
2006.12.03
Проект.


4-1153296669
Интересующийся
2006-07-19 12:11
2006.12.03
Два вопроса о региональных стандартах


3-1159508316
Megabyte
2006-09-29 09:38
2006.12.03
Ошибка при работе с драйвером Gemini через ADO


1-1161334225
alexvan
2006-10-20 12:50
2006.12.03
Вопрос по TCustomDBGrid


2-1163720755
Basement
2006-11-17 02:45
2006.12.03
Правильно ли использую ZeroMemory ? И можно ли обнулить быстрее ?