View Full Version : مشکل در تبدیل نوع Numeric
Delphi KDE
جمعه 06 شهریور 1383, 03:34 صبح
اول باید بگم که نمیدونستم این موضوع را باید در بخش دلفی مطرح کنم یا در بخش فاکس چون دیدم مشکل اصلی با فاکس است در اینجا مطرح کردم
در یک برنامه دلفی نیاز به ساخت یک جدول فاکس در زمان اجرا است
در این جدول یک فیلد numeric دو رقمی وجود دارد
مشکل در اینجاست که این فیلد numeric دو رقمی را چطور تعریف بکنم
منظورم از چه نوعی است که زمانی که در فاکس از این جدول استفاده شد
همان فیلد numric دو رقمی ساخته شده باشد
س.حمیدیانفر
جمعه 06 شهریور 1383, 08:52 صبح
سلام
شما میتونید این جدول رو اول توی فاکس یا بهتر ویژوال فاکس بسازید بعد توی دلفی هر اطلاعاتی که میخواین رو توش بریزین
البته شاید من کاملا متوجه منظورتون نشدم اگه بیشتر توضیح بدین بهتر میتونیم کمکتون کنیم
موفق باشید
rezaTavak
جمعه 06 شهریور 1383, 13:31 عصر
سلام
دوست عزیز شما هر طوری که بسازی جدولتون جواب میده. یعنی توی دلفی و فاکس فرق نداره مهم اینه که ساختار DBF یکی است.
kia1349
شنبه 07 شهریور 1383, 07:01 صبح
نوع فیلد را همون numeric تعریف کنید تا برای استفاده جدول در فاکس مشکلی پیش نیاید
Delphi KDE
یک شنبه 08 شهریور 1383, 02:00 صبح
زمانی که در دلفی میخواهم فیلدی از نوع numeric دو رقمی را بسازم
نوع فیلد numeric در دلفی وجود ندارد
برای همین من از انواع عددی دیگر استفاده کردم ولی بلا فاصله بعد از مشخص کردن دو رقمی بودن فیلد پیغام خطا میدهد
این بانک باید حتما در زمان اجرا ساخته شود
kia1349
یک شنبه 08 شهریور 1383, 06:32 صبح
string تعریف کن و توی برنامه فاکس با تابع val اونو به numeric تبدیل کن
<span dir=ltr>aa=val(myfieldname)</span>
یا اگر میخواهی که اعشار اون هم حذف بشه(درصورت داشتن اعشار)
<span dir=ltr>aa=int(val(myfieldname))</span>
نمیدونم میتونه کمکت کنه یا نه
به هر حال خیلی از جاها که فیلد numeric جواب نمیده تنها راه استفاده از فیلد string است یا فیلد text
Delphi KDE
دوشنبه 09 شهریور 1383, 01:15 صبح
خیلی از راهنمایی شما ممنونم kia1349
ولی خروجی این برنامه ورودی برنامه دیگری است و برای همین حتما باید به صورت numeric دو رقمی ساخته شود
rezaTavak
دوشنبه 09 شهریور 1383, 22:22 عصر
سلام
خب از استراکچر بانک استفاده کن و دستی خودتون بسازید.
استراکچر فایلهای DBF در راهنمای آن هست.
Delphi KDE
سه شنبه 10 شهریور 1383, 00:49 صبح
مثل اینکه نتونستم مشکلمو درست مطرح کنم
مشکل اصلی ساخت بانک dbf در زمان اجراست که این بانک فیلدی از نوع numeric دو رقی دارد
و چون در دلفی در هنگام ساخت جدول dbf انواع مختلف داده های عددی وجود دارد ولی نوع numeric در بین انها نیست و اگر از انواع عددی دیگر بخواهم استفاده کنم زمانی که دو رقمی بودن فیلد را مشخص میکنم دلفی پیغام خطا میدهد و این بانک حتما باید در زمان اجرا ساخته شود و نباید آن را دستی ساخت
این موضوع را برای این اینجا مطرح کردم که شاید یک برنامه نویس فاکس به چنین مشکی قبلا بر خورده باشد
kia1349
سه شنبه 10 شهریور 1383, 06:10 صبح
ما در فاکس انواع داده ها را داریم و تا حالا به این مشکل بر نخورده ایم
binyaz2003
سه شنبه 10 شهریور 1383, 10:02 صبح
سلام
اگر نوع اینتیجر داره اونو امتحان کردین؟
rezaTavak
سه شنبه 10 شهریور 1383, 12:35 عصر
خب باشه من اون را برات با مثال میزم البته در دلفی!
Delphi KDE
چهارشنبه 11 شهریور 1383, 00:47 صبح
اگر نوع اینتیجر داره اونو امتحان کردین؟
بله نوع integer دارد ولی در صورت مشخص کردن تعداد ارقام پیغام خطا میدهد
rezaTavak پیشاپیش ممنونم :flower:
rezaTavak
چهارشنبه 11 شهریور 1383, 15:35 عصر
سلام
اول این را از MicroSoft است:
Table File Structure (.dbc, .dbf, .frx, .lbx, .mnx, .pjx, .scx, .vcx)
Visual FoxPro uses tables to store data that defines different file types. The file types that are saved as table files are:
• Table (.dbf)
• Database (.dbc)
• Form (.scx)
• Label (.lbx)
• Menu (.mnx)
• Project (.pjx)
• Report (.frx)
• Visual Class Library (.vcx)
Because these files are actually tables, you can use and browse them in the same way that you browse any .dbf file.
A table file is made up of a header record and data records. The header record defines the structure of the table and contains any other information related to the table. It starts at file position zero. The data records1 follow the header (in consecutive bytes) and contain the actual text of the fields.
For information about the table structures of the different file types, see Table Structures of Table Files.
The length of a record (in bytes) is determined by summing the defined lengths of all fields. Integers in table files are stored with the least significant byte first.
Table Header Record Structure
Byte offset Description
0 Type of file
0x02 FoxBASE
0x03 FoxBASE+/dBASE III PLUS, no memo
0x30 Visual FoxPro
0x43 dBASE IV SQL table files, no memo
0x63 dBASE IV SQL system files, no memo
0x83 FoxBASE+/dBASE III PLUS, with memo
0x8B dBASE IV with memo
0xCB dBASE IV SQL table files, with memo
0xF5 FoxPro 2.x (or earlier) with memo
0xFB FoxBASE
1 – 3 Last update (YYMMDD)
4 – 7 Number of records in file
8 – 9 Position of first data record
10 – 11 Length of one data record (including delete flag)
12 – 27 Reserved
28 Table Flags
0x01 file has a structural .cdx
0x02 file has a Memo field
0x04 file is a database (.dbc)
Note that this byte can contain the sum of
any of the above values. For example, 0x03
indicates the table has a structural .cdx
and a Memo field.
29 Code page mark
30 – 31 Reserved, contains 0x00
32 – n Field subrecords
The number of fields determines the number of field subrecords. There is one field subrecord for each field in the table.
n+1 Header record terminator (0x0D)
n+2 to n+264 A 263-byte range that contains the backlink information (the relative path of an associated database (.dbc)). If the first byte is 0x00 then the file is not associated with a database. Hence, database files themselves always contain 0x00.
1 The data in the data file starts at the position indicated in bytes 8 to 9 of the header record. Data records begin with a delete flag byte. If this byte is an ASCII space (0x20) the record is not deleted; if the first byte is an asterisk (0x2A) the record is deleted. The data from the fields named in the field subrecords follows the delete flag.
Field Subrecords Structure
Byte offset Description
0 – 10 Field name (maximum of 10 characters; if less than 10, it is padded with null character (0x00))
11 Field Type:
C – Character
Y – Currency
N – Numeric
F – Float
D – Date
T – DateTime
B – Double
I – Integer
L – Logical
M – Memo
G – General
C – Character (binary)
M – Memo (binary)
P – Picture
12 – 15 Displacement of field in record
16 Length of field (in bytes)
17 Number of decimal places
18 Field Flags
0x01 System Column (not visible to user)
0x02 Column can store null values
0x04 Binary column (for CHAR and MEMO only)
19 – 32 Reserved
For information about limitations on characters per record, maximum fields, and so on, see Visual FoxPro System Capacities.
Remarks
Visual FoxPro does not modify the header of a file that has been saved to a FoxPro 2.x file format unless one of the following features has been added to the file:
• Null value support
• DateTime, Currency, and Double data types
• CHAR or MEMO field is marked as Binary
• A table is added to a database (.dbc) file
Tip You can use the following formula to return the number of fields in a table file: (x – 296/32). In the formula, x is the position of the first record (bytes 8 to 9 in the table header record), 296 is 263 (backlink info) + 1 (header record terminator) + 32 (first field subrecord), and 32 is the length of a field subrecord.
________________________________________
© 2001 Microsoft Corporation. All rights reserved.
خب با توجه به توضیحات خود میکروسافت مشخصات اولین فیلد از بایت 33 تا 64 و مشخصات فیلد دوم از 65 تا 96و.. با توجه به این موضوع شما جدولتان را بسازید و فیلد خود را به صورت کاراکتری به طول دو بایت تعریف کنید و بعد از آن جدول را ببنیدید و با دستورات فایل خودتان را به صورت باینری باز کنید سپس هر فیلدی را که می خواهید با توجه به جدول فوق عوض کنید. مثلا فرض کنید فیلد اول شما باید Numeric باشد، شما باید کاراکتر شماره 44 (32 بایت هدر جدول، 11 بایت طول نام فیلد) را از C به N تبدیل کنید و به همین صورت فیلد دوم 44+32 و فیلد سوم 44+32*2 و... بعد هم فایل را ببندید. یک نکته آن هم در فاکس پرو اولین بایت فایل از شماره صفر شروع میشود و بنابراین من در آلگوریتم از عدد 43 استفاده کرده ام. اما اگر دلفی شماره را از یک شروع کرد (که قاعدتا نمیکند) شما عدد 44 را به خاطر داشته باشید. یه چیز جالب اینکه در فاکس بیشتر از 20 رقم برای عددی نداریم با این روش شما بیش از 20 رقم هم میتوانید داشته باشید!
این هم آلگوریتمش:
تابع تغییر ساختار جداول DBF از Char به Number
پارامترهای تابع: نام فایل – شماره فیلد که باید نوع آن عوض شود.
مقادیر بازگشتی: عدد 0 موفقیت- 1 عدم باز شدن فایل - 2 عدم ساختار مناسب- 3 عدم توانایی تغییر در فایل
1- فایل به صورت خواندن نوشتی باز شود.
2- اگر فایل با موفیت باز نشد خروج و مقدار بازگشتی 1
3- حرکت نشانگر فایل به شماره زیر: (شماره فیلد -1)* 32+43
4- خواندن یک بایت
5- اگر این مقدار مخالف "C" بود بستن فایل و بازگشت مقدار 2
6- حرکت نشانگر فایل به شماره زیر: (شماره فیلد -1)* 32+43
7- نوشتن مقدار "N" در فایل. (دقت کنید N نوشته شود نه n)
8- اگر با موفیت نوشته نشد بستن فایل و بازگشت مقدار 3
9- بستن فایل
10- بازگشت مقدار 0
7- پایان تابع
این هم یک تابع امتحان شده که در فاکس نوشتم
FUNCTION ModifyStructureCharToNumber
LPARAMETERS tcFileName, tnFieldNumber
LOCAL lnFileHandle, lcFieldType, lnSuccess
lnFileHandle = FOPEN(tcFileName,2)
IF lnFileHandle < 0
RETURN 1 && File Open Error
ENDIF
lnFileSeek = FSEEK(lnFileHandle, 43 + (tnFieldNumber - 1) * 32, 0)
IF lnFileSeek <> 43 + (tnFieldNumber - 1) * 32
FCLOSE(lnFileHandle)
RETURN 5 && File Structure is not ture
ENDIF
lcFieldType = FREAD(lnFileHandle, 1)
IF lcFieldType<> "C"
FCLOSE(lnFileHandle)
RETURN 2 && Field Not char type
ENDIF
FSEEK(lnFileHandle, 43 + (tnFieldNumber - 1) * 32, 0)
lnSuccess = FWRITE(lnFileHandle, "N", 1)
FCLOSE(lnFileHandle)
IF lnSuccess < 1
RETURN 3 && Can't to write to file
ENDIF
RETURN 0
ENDFUNC
امیداورام منظور من را گرفته باشی راستش دلفی چون زیاد کار نکردم نتونستم برات درش بیارم ببخشید شاید از این کد بتونی استفاده کنی و به دلفی تبدیلش کنی
reza1357
پنج شنبه 12 شهریور 1383, 08:31 صبح
سلام
[quote] خب باشه من اون را برات با مثال میزم البته در دلفی! [quote]
دوست عزیز با اجازه شما یک مثال براش می ذارم البته اگر توی این دو روز وقت کردم
:موافق:
reza1357
جمعه 13 شهریور 1383, 09:27 صبح
سلام
ایا از رویداد max_lenth استفاده کردی
من فیلدی دو رقمی ایجاد کردم مشکلی نداشت فقط در بعضی از جاها توی ورودی بیشتر از دو رقم می گیره
Delphi KDE
دوشنبه 16 شهریور 1383, 00:45 صبح
خیلی ممنونم از همگی شما
ایا از رویداد max_lenth استفاده کردی
خیر از Max Lenth استفاده نکردم
این بانک در دلفی ساخته و پر میشود ولی در foxpro مورد استفاده قرار میگیرد
اگر فاکس مشکی نداشته باشه منم مشکلی ندارم (:D)
rezaTavak
دوشنبه 16 شهریور 1383, 16:02 عصر
سلام
مگه اون برنامه مفید نبود؟
"رویداد MaxLength به درد ساخت بانک نمی خورد دوست عزیز. آن فقط موقع ورود اطلاعات ورودی را چک میکند بیش از یک حد نشود که کاربر فکر کند تمام آن چیزی که وارد کرده در بانک قرار میگیرد."
reza1357
دوشنبه 16 شهریور 1383, 21:35 عصر
این بانک در دلفی ساخته و پر میشود ولی در foxpro مورد استفاده قرار میگیرد
من نفهمیدم برای چی توی دلفی ساخته میشه و توی فاکس استفاده میشه نمیشه توی یکی از این دوتا ساخته و استفاده بشه
خوب این کار یخورده سرعت کار وغیره را پاین میاره و کاربر اذیت میشه اینطور نیست :?:
Delphi KDE
سه شنبه 17 شهریور 1383, 01:52 صبح
این بانک در دلفی ساخته و پر میشود ولی در foxpro مورد استفاده قرار میگیرد
برنامهای که میخواهم بنویسم قسمتی از یک برنامه پرسنلی است که از مدتها پیش با زبان دلفی نوشته شده
وظیفه این برنامه تبدیل جداول برنامه پرسنلی که به صورت فارسی (1256)میباشد به فارسی(IranSystem ) است
البته فعلا به صورت موقت از روش دیگری استفاده کردم در این روش ابتدا بوسیله فاکس استراکچر بانک را ساختم و سپس بانک را درون یک فایل فشرده ذخیره کردم و در موقع لزوم بانک را از درون فایل فشرده خارج میکنم و توسط BatchMove اطلاعات را از بانک اصلی که access است به بانک فاکس تبدیل میکنم
ولی میخواهم بتوانم بانک را از درون دلفی بسازم
باز هم از همه دوستان ممنونم
reza1357
سه شنبه 17 شهریور 1383, 07:48 صبح
دوست عزیز سلام
بانک های که داری توی اکسس است درسته اگر اینطور باشه مشکلت حله چون با ایجاد یک کوری در اکسس ان چیزی که می خوای از ان اطلاعات استخراج کنی می سازی (درصورتی که اکسس کار کرده باشی)
دوست عزیز اگر کمک بیشتری نیاز داری برایم pm بذار که بتونم بیشتر رانمایت کنم
vBulletin® v4.2.5, Copyright ©2000-1404, Jelsoft Enterprises Ltd.