Форум » [x]Harbour » Как сделать программу 64битной ? » Ответить

Как сделать программу 64битной ?

Andrey: Всем привет ! Только не пинайте сильно за вопрос... Пока только разбираюсь.... Как готовое приложение под хХарбором (терминалка) пересобрать на 64bit под новые системы Win 7 ? Оно конечно и так там работает, но хотелось бы узнать что это даст ?

Ответов - 57, стр: 1 2 3 All

Andrey: Pasha пишет: Каким методом выбираются оплаты ? Andrey пишет: По ID-абонента, seek-ом иду на БД-оплаты-20хх года. SELECT PLATA2011 DBSETORDER(1) GOTO TOP SEEK (ID-абонента) Pasha пишет: Что записывается в оплаты и как, каким методом ? После расчета, запись массива WritDimDbf(aMassiv,.F., @cError) ********************************************************* FUNCTION WritDimDbf(aMassiv,lSee,cError) LOCAL cTemp, nJ, nSum, nY:=MAXROW(), nX:=0, nRazr DEFAULT lSee TO .T. cError := "" FOR nJ := 1 TO 30 IF lSee cTemp:="Записываю записи: "+STR(nJ,2) @ nY,nX SAY PADC(cTemp,80) COLOR("14/5") ENDIF cTemp:="Tarif"+IIF(nJ<10,"0"+STR(nJ,1),STR(nJ,2)) nSum := aMassiv[nJ,A_TARIF] // Тариф "N" , 6,2 nRazr:= FIELDSIZE(FIELDNUM(cTemp)) IF nRazr < LEN(ALLTRIM(STR(nSum))) cError:=cError+'Нехватает разрядности поля "'+cTemp+'" <-'+STR(nSum)+; " [размерность поля ="+; ALLTRIM(STR(nRazr))+" - размерность запис.значения ="+; ALLTRIM(STR(LEN(ALLTRIM(STR(nSum)))))+"]"+CRLF FIELD->&cTemp := -1 ELSE FIELD->&cTemp := nSum ENDIF cTemp:="TarDat"+IIF(nJ<10,"0"+STR(nJ,1),STR(nJ,2)) FIELD->&cTemp := aMassiv[nJ,A_TARDAT] // Дата Тарифа "D" , 8,0 cTemp:="Prixod"+IIF(nJ<10,"0"+STR(nJ,1),STR(nJ,2)) nSum := aMassiv[nJ,A_PRIXOD] // Приход "N" , 6,2 nRazr:= FIELDSIZE(FIELDNUM(cTemp)) IF nRazr < LEN(ALLTRIM(STR(nSum))) cError:=cError+'Нехватает разрядности поля "'+cTemp+'" <-'+STR(nSum)+; " [размерность поля ="+; ALLTRIM(STR(nRazr))+" - размерность запис.значения ="+; ALLTRIM(STR(LEN(ALLTRIM(STR(nSum)))))+"]"+CRLF FIELD->&cTemp := -1 ELSE FIELD->&cTemp := nSum ENDIF cTemp:="PriDat"+IIF(nJ<10,"0"+STR(nJ,1),STR(nJ,2)) FIELD->&cTemp := aMassiv[nJ,A_PRIDAT] // Дата Прихода "D" cTemp:="Koplata"+IIF(nJ<10,"0"+STR(nJ,1),STR(nJ,2)) FIELD->&cTemp := aMassiv[nJ,A_KOPLATA] //Вид оплаты cTemp:="Nachis"+IIF(nJ<10,"0"+STR(nJ,1),STR(nJ,2)) nSum := aMassiv[nJ,A_NACHIS] // Начислено "N" , 6,2 nRazr:= FIELDSIZE(FIELDNUM(cTemp)) IF nRazr < LEN(ALLTRIM(STR(nSum))) cError:=cError+'Нехватает разрядности поля "'+cTemp+'" <-'+STR(nSum)+; " [размерность поля ="+; ALLTRIM(STR(nRazr))+" - размерность запис.значения ="+; ALLTRIM(STR(LEN(ALLTRIM(STR(nSum)))))+"]"+CRLF FIELD->&cTemp := -1 ELSE FIELD->&cTemp := nSum ENDIF cTemp:="Dobavka"+IIF(nJ<10,"0"+STR(nJ,1),STR(nJ,2)) nSum := aMassiv[nJ,A_DOBAVKA] // Добавление к Начислено "N" , 6,2 nRazr:= FIELDSIZE(FIELDNUM(cTemp)) IF nRazr < LEN(ALLTRIM(STR(nSum))) cError:=cError+'Нехватает разрядности поля "'+cTemp+'" <-'+STR(nSum)+; " [размерность поля ="+; ALLTRIM(STR(nRazr))+" - размерность запис.значения ="+; ALLTRIM(STR(LEN(ALLTRIM(STR(nSum)))))+"]"+CRLF FIELD->&cTemp := -1 ELSE FIELD->&cTemp := nSum ENDIF cTemp:="NacDat"+IIF(nJ<10,"0"+STR(nJ,1),STR(nJ,2)) FIELD->&cTemp := aMassiv[nJ,A_NACDAT] // Дата Начисления "D" cTemp:="Dolg"+IIF(nJ<10,"0"+STR(nJ,1),STR(nJ,2)) nSum := aMassiv[nJ,A_DOLG ] // Задолжность "N" , 7,2 nRazr:= FIELDSIZE(FIELDNUM(cTemp)) IF nRazr < LEN(ALLTRIM(STR(nSum))) cError:=cError+'Нехватает разрядности поля "'+cTemp+'" <-'+STR(nSum)+; " [размерность поля ="+; ALLTRIM(STR(nRazr))+" - размерность запис.значения ="+; ALLTRIM(STR(LEN(ALLTRIM(STR(nSum)))))+"]"+CRLF FIELD->&cTemp := -1 ELSE FIELD->&cTemp := nSum ENDIF cTemp:="Docum"+IIF(nJ<10,"0"+STR(nJ,1),STR(nJ,2)) FIELD->&cTemp := aMassiv[nJ,A_DOCUM] // No документа оплаты "C" 20,0 cTemp:="Box"+IIF(nJ<10,"0"+STR(nJ,1),STR(nJ,2)) FIELD->&cTemp := aMassiv[nJ,A_BOX] // No пачки "C" 8,0 cTemp:="Rem"+IIF(nJ<10,"0"+STR(nJ,1),STR(nJ,2)) FIELD->&cTemp := aMassiv[nJ,A_REM] // Комментарий "C" 8,0 NEXT RETURN NIL Забыл еще уточнить. Сумма начислений (приход денег и начисления денег и долг) по каждому абоненту еще сохраняются и отдельно по каждому подъезду, за каждый месяц заносятся в БД-Договоров.

Pasha: Я уже устал напрягать свои и без того неразвитые телепатические способности :) Итак, что же мне удалось расшифровать: Имеется широоооокая таблица (не БД, давай все-таки использовать общепринятую, а не безграмотную терминологию) абонентов, назовем ее TA. Что хранится в ТА ? Все данные со всеми начислениями за все годы ? В чем заключается расчет ? Имеется какая-то таблица тарифов (назовем ее TT). Какова ее структура ? Что там, виды услуг, тарифы с изменением по периодам времени ? Как из нее выбираются записи ? Тарифы выбираются в основном цикле по абонентам ? Имеется таблица оплат (назовем ее TO aka PLATA2011). Она хранит в одной записи все оплаты абонента за 10 лет по месяцам ? Или за 1 год ? Что такое 30 ? В приведенной процедуре просто сбрасывается какая-то одна запись. Зачем выполняется магическое действие сначала считывания из таблицы в массив, а затем запись из массива в таблицу каких-то данных ? Это одни и те же данные ? Зачем их гонять туда-сюда ? Что и как хранится отдельно по каждому подьезду и заносится в, хм, БД, Договора ? Для чего ты собрался использовать hbmemio ? Вместо массива 12*30, что ли ? Так это же полный абсурд. Андрей, моих способностей гадалки, телепата и экстрасенса недостаточно. Если хочешь какой-то помощи - подробно опиши свой алгоритм, со всеми выполняемыми действиями. Ну а нет - так нет. Пару слов про использование массива. 1. В цикле можно использовать промежуточную переменную: amj := aMassiv[nJ] и затем вместо aMassiv[nJ,A_TARIF] использовать amj[A_TARIF], и так для всех 12-ти элементов 2. Поскольку для расчета всех абонентов используется массив одинакового размера, его можно не создавать/уничтожать для каждого абонента, а использовать один и тот же, просто перекрывая данные. Это позволит избежать несколько десятков тысяч операций создания/уничтожения. Впрочем, думается, это даст немного. Узкое место еще ведь не выяснено. Хотя, конечно, можно использовать чудесный "метод подитогов" из 1С. Это сразу волшебным образом сократит время всего расчета до 1-й секунды.

Andrey: Pasha пишет: Я уже устал напрягать свои и без того неразвитые телепатические способности :) Ну извини, не хотел сильно нагружать ! Pasha пишет: Имеется таблица оплат (назовем ее TO aka PLATA2011). Она хранит в одной записи все оплаты абонента за 10 лет по месяцам ? Или за 1 год ? Что такое 30 ? В приведенной процедуре просто сбрасывается какая-то одна запись. Одна запись хранит приходы денег, даты прихода денег, даты начисления и сумму начисления и т.д. за ОДИН год. 30 записей за год (т.к. я писал ранее про "ерунду" творящуюся при перечислении денег) и 12 записей не хватает на год. Pasha пишет: Зачем выполняется магическое действие сначала считывания из таблицы в массив, а затем запись из массива в таблицу каких-то данных ? Это одни и те же данные ? Зачем их гонять туда-сюда ? Данные по абоненту, у которого различается тариф оплаты, сумма оплаты, сумма и дата прихода денег и т.д. - все загоняется в массив, далее делаем начисления (пересчет с начала года, мало ли что было: изменили тариф, ставки тех.обсл.), далее записываем массив в поля ОДНОЙ записи таблицы. Pasha пишет: Что и как хранится отдельно по каждому подьезду и заносится в, хм, БД, Договора ? Это пока несущественно. Pasha пишет: Для чего ты собрался использовать hbmemio ? Вместо массива 12*30, что ли ? Так это же полный абсурд. Хочу всю таблицу ТА записать в память, потом сделать начисления, а потом сбросить в таблицу ТА уже с расчетами на диск. Pasha пишет: Андрей, моих способностей гадалки, телепата и экстрасенса недостаточно. Если хочешь какой-то помощи - подробно опиши свой алгоритм, со всеми выполняемыми действиями. Понятно, что трудно понять чужую тематику (я сам уже в этот алгоритм 5 лет не лез, как с Клипера перенес) и с такими моими "куцими" объяснениями. Но я хотел не углубляться в код и не грузить вас этим. Придется наверно все-таки подробно ВСЕ описать. Но на это нужно время. Пока беру паузу для подготовки описания алгоритма. Чуть позже напишу. Спасибо за помощь !!!


Andrey: PSP пишет: Имхо, весь затык в постоянной передаче по сети. Letodb может помочь. Попробуй на копии рабочей базы. Там-то много не нужно переделывать. Andrey пишет: Ищу пока промежуточный вариант - запуск на сервере, отдельной программой ! Я хочу пока отдельную программу сделать !!! А уже потом Letodb прикручивать....

Pasha: Andrey пишет: Хочу всю таблицу ТА записать в память, потом сделать начисления, а потом сбросить в таблицу ТА уже с расчетами на диск. Совершенно бессмыссленное намерение, которое только замедлит расчет. Когда записывать данные: в процессе расчета по одному абоненту, или в конце по всем - разницы не имеет. Более того, записывать по одному будет быстрее, так как запись уже спозиционирована, а если записывать все - эту запись надо еще найти. Да и к тому же держать в памяти сотни мегабайт или более данных на пользу не пойдет в любом случае.

Andrey: Pasha пишет: Да и к тому же держать в памяти сотни мегабайт или более данных на пользу не пойдет в любом случае. Спасибо большое !

S-A-N: Андрей, не знаю тонкостей твоего алгоритма, но: Pasha пишет: записывать по одному будет быстрее В моей программе по расчету зарплаты пункта "Расчет" нет в принципе. При вводе бухгалтером любого начисления автоматически выполняется полный перерасчет по человеку. О плюсах и минусах такого подхода можно, конечно, спорить. Но могу сказать, что расчет выполняется мгновенно, БД всегда в актуальном состоянии. В твоем случае, когда перерасчет по человеку выполняется за 0.08 с, все это будет происходить незаметно даже без изменения существующего механизма обработки.

AlexMyr: S-A-N пишет: При вводе бухгалтером любого начисления автоматически выполняется полный перерасчет по человеку. Тоже интересный вариант.

Pasha: Насколько я понимаю, здесь несколько другая специфика. Данные для начислений есть изначально, а вводятся только немногочисленные изменения. Так что без общего расчета не обойтись.

S-A-N: Pasha пишет: без общего расчета не обойтись Расчета чего? Суммы к оплате? А зачем ее хранить? Насколько я понимаю тариф - это условно постоянная величина, которую нет смысла дублировать (12 мес.) * (кол-во лет) * (кол-во абонентов) раз. Речь может идти только о хранении информации об оплате и льготах (если есть). Тогда при выводе информации (на принтер или монитор) о текущем состоянии расчетов с абонентом сумму к оплате можно получать динамически. Если есть необходимость эту информацию разносить по другим таблицам, то это можно делать во время печати квитанций на оплату. "Тормозов" в расчете не будет, поскольку печать более медленная операция. И о структуре таблицы оплат. Андрей, а что будет, если абонент будет вносить оплату не одной, а 2-3-... суммами ежемесячно? Не проще ли хранить информацию в виде ID абона, дата оплаты, сумма, за какой период, прочая сопроводительная инфа. Хотя, опять же, не зная постановки задачи, трудно рассуждать.

Andrey: S-A-N пишет: И о структуре таблицы оплат. Андрей, а что будет, если абонент будет вносить оплату не одной, а 2-3-... суммами ежемесячно? Не проще ли хранить информацию в виде ID абона, дата оплаты, сумма, за какой период, прочая сопроводительная инфа. Вот из-за этого и сделано 30 граф для прихода денег PLATA2011 (почитай выше). А информация так и храниться в отдельной базе прихода денег (таблица оплат) по записям: 1запись - 1 приход денег. Когда деньги за текущий месяц закончили приходить из банка, РКЦ и т.д. то делаем перенос денег по конкретным абонентам (в таблицу PLATA2011 в свободную ячейку), а потом уж делаем расчет (начисление) по всей таблице абонентов (ТА). Из-за этого раз в месяц нужно делать ОБЩИЙ расчет. После этого и делается печать долгов, печать квитанций и т.д., следуя специфики предприятия. Они все делают по разному, одни печатают, другие не печатают... их трудно понять.... Я на этой задаче 12 год сижу. Делал на Клипере 5.3 под Новел, потом перевел на хХарбор. Сейчас бы конечно сделал бы по другому, но тогда компы были очень слабыми, а Клипер шустро считал и выдавал сведения. А пределать что-то по другому в работающей программе - это целая ЭПОПЕЯ, всем сразу становится неудобно, шумят, что раньше понятней было и цвет лучше был и т.д. Одна морока по переводу.... Это если с нуля новому предприятию даешь новую программу, то все нормально, привыкают сразу.

Pasha: Andrey пишет: А информация так и храниться в отдельной базе прихода денег (таблица оплат) по записям: 1запись - 1 приход денег. Когда деньги за текущий месяц закончили приходить из банка, РКЦ и т.д. то делаем перенос денег по конкретным абонентам (в таблицу PLATA2011 в свободную ячейку), а потом уж делаем расчет (начисление) по всей таблице абонентов (ТА). Из-за этого раз в месяц нужно делать ОБЩИЙ расчет. А зачем что-то куда-то переносить ? В таблице оплат достаточно иметь индекс по ID абонента и дате оплаты: Str(ID)+DTOS(Date), и по нему всегда можно выбрать оплату за произвольный промежуток времени. Если бы использовался letodb, это можно было бы сделать одним вызовом leto_Sum()

S-A-N: Pasha пишет: А зачем что-то куда-то переносить ? В таблице оплат достаточно иметь индекс по ID абонента и дате оплаты Вот-вот. И я о том же. Причем это будет работать лучше, чем сейчас даже без Leto DB (это, если нет времени переходить на него).

Петр: Pasha пишет: Для чего ты собрался использовать hbmemio ? Вместо массива 12*30, что ли ? Так это же полный абсурд. Ну я ему посоветовал.. Но в тот момент я не знал, что и как Андрей собирается делать. И теперь не совсем понимаю логику его действий. А код WritDimDbf вообще вызывает улыбку

Pasha: Да, судя по всему, причина медленного расчета - неправильная организация данных Такое лечится только банальной нормализацией, и больше ничем.

Andrey: Pasha пишет: Да, судя по всему, причина медленного расчета - неправильная организация данных Такое лечится только банальной нормализацией, и больше ничем. А я разве спорю ? Это делалось еще в 1998 году, я про это писал уже.... Andrey пишет: Я на этой задаче 12 год сижу. Делал на Клипере 5.3 под Новел, потом перевел на хХарбор. Сейчас бы конечно сделал бы по другому, но тогда компы были очень слабыми, а Клипер шустро считал и выдавал сведения. Петр пишет: А код WritDimDbf вообще вызывает улыбку Ну извини, я тогда так сделал как понимал.... Заместо улыбок, лучше напиши как нужно делать правильно.

SAAN: Andrey пишет: Я на этой задаче 12 год сижу. Делал на Клипере 5.3 под Новел, потом перевел на хХарбор. Сейчас бы конечно сделал бы по другому, Так в чём проблема?



полная версия страницы