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

Вниз

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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.46 MB
Время: 0.042 c
2-1163766009
Grant
2006-11-17 15:20
2006.12.03
ODBC


2-1163853193
Alians
2006-11-18 15:33
2006.12.03
Подключение интернета.


15-1163187248
koha
2006-11-10 22:34
2006.12.03
Уважаемые господа!


15-1162525607
maxistent
2006-11-03 06:46
2006.12.03
Виртуальный CD-ROM


15-1163354184
Piter
2006-11-12 20:56
2006.12.03
Где купить хороший рюкзак?





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