Главная страница
    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.048 c
5-1144509756
SaFy
2006-04-08 19:22
2006.12.03
Прозрачный Edit


4-1153033422
apic
2006-07-16 11:03
2006.12.03
работа с железом


1-1161766957
rif
2006-10-25 13:02
2006.12.03
Выпадение приложения


15-1163598855
VICTOR_
2006-11-15 16:54
2006.12.03
Не запускается Host Application


2-1163495203
MishaLukash
2006-11-14 12:06
2006.12.03
DBGrid.Columns.Width не отображает поле во всю длинну





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