Головна сторінка
Top.Mail.Ru Яндекс.Метрика
Форум: "Основна";
Поточний архів: 2004.12.12;
Завантажити: [xml.tar.bz2];

Вниз

Допоможіть вирішити проблемму з функцією Знайти схожі гілки


DelphiN! ©   (2004-11-30 08:38) [0]

Є функція, яка перетворює введену суму грошей під час, виходячи з "Таблиці списку послуг", в якій зберігатиметься інформація в наступному вигляді:

Name Summa Vremia_S Vremia_Po Comp_S Comp_Po

Ігри 60 12: 00 18: 00 1 200
Інтернет 120 18: 00 22: 00 1 200
... ... ... ... ... ...

Поле Summa в таблиці заповнене списком цін послуг за годину

Так ось ця ф-ія "працює через раз" Те вважає правильно, то зациклюється, зациклюється до речі через те, що вираз:

Money: = Money - ((DateTimeToUnix (Time_Po) - DateTimeToUnix (_Time)) / 60) * (DataSet.FieldByName ( "Summa"). AsFloat / 60);
           

іноді не дає ніяких результатів, тобто
((DateTimeToUnix (Time_Po) - DateTimeToUnix (_Time)) / 60) * (DataSet.FieldByName ( "Summa"). AsFloat / 60) дорівнює нулю, і виходить (Money: = Money - 0). Так ось я зрозуміти не можу що тут неправильно, і чому то працює, то неработает ... Схоже це залежить від поточного часу ...

Допоможіть розібратися, від зовсім голова не варить ...
// Тип повертається ф-ие MoneyToTime type TimeStruct = Record VremyaOkonchania: TTime; Prodoljitelnost: String; end; function MoneyToTime (Money: Real; __ Time: TTime; Usluga: String; CompNo: Integer; DataSet: TClientDataSet): TimeStruct; // Ф-ія перевірки приналежності часу заданому діапазону function TestTime (t, MinTimeInt, MaxTimeInt: TDateTime): Boolean; begin t: = StrToDateTime ( "01.01.2004" + TimeToStr (t)); MinTimeInt: = StrToDateTime ( "01.01.2004" + TimeToStr (MinTimeInt)); MaxTimeInt: = StrToDateTime ( "01.01.2004" + TimeToStr (MaxTimeInt)); if T <MinTimeInt then T: = T + 1; if MaxTimeInt <MinTimeInt then MaxTimeInt: = MaxTimeInt + 1; if InRange (t, MinTimeInt, MaxTimeInt) then result: = true else result: = false; end; // Тіло ф-ії перетворення грошей під час (MoneyToTime) var _Time: TDateTime; i2: integer; Time_PO: TDateTime; m: Real; Count: Integer; begin __Time: = StrToDateTime ( "01.01.2004" + TimeToStr (__ Time)); _Time: = __Time; Count: = 0; while Money> 0 do begin Inc (Count); if Count> 100 then begin ShowMessage ( "У таблиці послуг обнвружен розрив! Ісправте таблицю послуг! "); Exit; end; for i2: = 1 to DataSet.RecordCount do begin DataSet.RecNo: = i2; if DataSet.FieldByName ( "Name"). AsString = Usluga then if (CompNo> = DataSet.FieldByName ( "Comp_s"). AsInteger) and (CompNo <= DataSet.FieldByName ( "Comp_po"). AsInteger) then if TestTime (_Time, DataSet.FieldByName ( "Vremia_s"). AsDateTime, DataSet.FieldByName ( "Vremia_po"). AsDateTime) then begin if (Money - ((DateTimeToUnix (StrToDateTime (DateToStr (_Time) + "" + DataSet.FieldByName ( "Vremia_po"). AsString)) - DateTimeToUnix (_Time)) / 60) * (DataSet.FieldByName ( "Summa"). AsFloat / 60))> 0 then Time_Po: = StrToDateTime (DateToStr (_Time) + "" + DataSet.FieldByName ( "Vremia_po"). AsString) else begin Time_Po: = UnixToDateTime (DateTimeToUnix (_Time) + Round ((DataSet.FieldByName ( "Summa"). AsFloat / 60) * Money) * 60); end; Money: = Money - ((DateTimeToUnix (Time_Po) - DateTimeToUnix (_Time)) / 60) * (DataSet.FieldByName ( "Summa"). AsFloat / 60); _Time: = UnixToDateTime (DateTimeToUnix (_Time) + (DateTimeToUnix (Time_Po) - DateTimeToUnix (_Time))); end end end; Result.VremyaOkonchania: = _Time; Result.Prodoljitelnost: = (DateTimeToUnix (_Time) - DateTimeToUnix (__ Time)); end;



DelphiN! ©   (2004-12-01 12:47) [1]

Переробив ф-ію так:

function MoneyToTime (Money: Real; __ Time: TTime; Usluga: String; CompNo: Integer; DataSet: TClientDataSet): TimeStruct; var _Time: TDateTime; i2: integer; Time_PO: TDateTime; m: Real; Count: Integer; begin __Time: = StrToDateTime ( "01.01.2004" + TimeToStr (__ Time)); _Time: = __Time; Count: = 0; while Money> 0 do begin Inc (Count); if Count> 10000 then begin ShowMessage ( "У ф-ії обнвружен розрив! Ісправте таблицю послуг!"); Exit; end; for i2: = 1 to DataSet.RecordCount do begin DataSet.RecNo: = i2; if DataSet.FieldByName ( "Name"). AsString = Usluga then if (CompNo> = DataSet.FieldByName ( "Comp_s"). AsInteger) and (CompNo <= DataSet.FieldByName ( "Comp_po"). AsInteger) then if TestTime (_Time, DataSet.FieldByName ( "Vremia_s"). AsDateTime, DataSet.FieldByName ( "Vremia_po"). AsDateTime) then begin Money: = Money - (DataSet.fieldbyname ( "summa"). AsFloat / 60); _Time: = _Time + (1 / 24 / 60); end end end; Result.VremyaOkonchania: = _Time; Result.Prodoljitelnost: = IntToStr ((DateTimeToUnix (_Time) - DateTimeToUnix (__ Time))); end;

Повільно, але вважає правильно. До речі попередній варіант зависає через
строки

Money: = Money - (DataSet.fieldbyname ( "summa"). AsFloat / 60); Чомусь в деяких випадках (DataSet.fieldbyname ( "summa"). AsFloat / 60) дає негативне число, а мінус на мінус дає плюс, чому виходить негативне число я ще не розібрався (часу зовсім немає). Може у кого є трохи вільного часу допоможе вирішити проблемму, від другої ( "Робочий") варіант ф-ії занадто довго вважає великі суми, а мені треба швидко, і це швидко можна тільки якщо виправити помилку в першій ф-ії ...



сторінки: 1 вся гілка

Форум: "Основна";
Поточний архів: 2004.12.12;
Завантажити: [xml.tar.bz2];

Вгору





Пам'ять: 0.57 MB
Час: 0.062 c
14-1100853530
Сер Джон
2004-11-19 11:38
2004.12.12
Microsoft засудить користувачів Linux


1-1101728157
Галинка
2004-11-29 14:35
2004.12.12
Проблеми з QRImage


1-1101646116
Tazik
2004-11-28 15:48
2004.12.12
Динамічні масиви.


4-1099204232
X-shadow
2004-10-31 09:30
2004.12.12
Як встановити на фаил специфічну іконку?


1-1101744804
frEE) stylEr
2004-11-29 19:13
2004.12.12
використання стрілок на клавіатурі





африкаанс албанський арабська вірменин азербайджанець баскський білоруський болгарська каталонський Китайська (спрощене письмо) Китайський традиційний) хорватський чеська данську мову нідерландський Ukranian естонець Філіппінська фінську мову французький
галісійська грузинський німецький грецький гаїтянський креольський давньоєврейську хінді угорський ісландський індонезієць ірландський італійський японський корейський латиська литовець македонець малайський мальтійський норвежець
перс полірування португальська румунський російська сербський словацький словенський іспанська суахілі шведську мову тайський турецька український урду в'єтнамський валлійський ідиш бенгальський боснійський
кебуано есперанто гуджараті хауса хмонг ігбо яванський каннада кхмерская Лао латинь маорі маратхі монгольський непальська панджабі сомалійський тамільська телугу йоруба
зулуський
Англійська Французький Німецький Італійський Португальська Русский Іспанська