| Subject |
Re: Copy an image field from one table to another |
| From |
Mervyn Bick <invalid@invalid.invalid> |
| Date |
Fri, 16 Apr 2021 16:13:30 +0200 |
| Newsgroups |
dbase.getting-started |
On 2021/04/16 11:18, roy price wrote:
> Hello Again,
> I was gaily adding additional photos to my file photos03, when I came across the message "Database engine fail" (not sure of the exact wording).
> I presume that means a corrupted file
> So I've gone back and copied a backup file, and wrote a small program to compare both files and add (the additional) records from the problem file to the backup file.
> As in select 1, fields to memory, select 2, and copy memory items to appended records. Then I realised that I do not know how to copy the binary field that way .
> Any suggestions?
> Regards
> Roy Price
>
If the photos03 table is corrupted it may not be possible to use it. On
the other hand, if you've been able to open the table by double-clicking
on it in the Navigator then all may not be lost.
One can't simply use replace a->fieldname with b->fieldname for a binary
(non text) field. The only way to get an image from one table to
another if one is not copying the entire table is to export the image to
a file and then load that file into the new file.
An added complication is if you have used an autoinc field as the id for
the images. One can't save a value to an autoinc field. One has to
append a blank record which will allow dBASE to assign a value to the
field.
Firstly, before you try anything you must only be working with copies of
the old backup table and photo03.
The following little program should do the job. Copy and paste it into
a new program file. Before you use it you must make sure that the
correct table names are used and that the correct number for the image
field is used. Change anything that is incorrect.
******** Start of program ********
cSource = 'photo03' //the damaged table which would not accept entries.
cTarget = 'backup01' //the old backup table which doesn't include
//the latest images
//Edit the lines above to show the correct table names.
//set up the damaged file which has images not previously saved
//to a backup
q = new query()
q.sql = 'select * from ' + cSource
q.active = true
//set up target file i.e the old backup which does not have all the images
q1 = new query()
q1.sql = 'select * from ' + cTarget
q1.active = true
//go to the bottom of the target table and save ID value for the
//last record. This will be used to find the corresponding record
//in photo03.
q1.rowset.last()
nId = q1.rowset.fields['id'].value
//Find that record in the source table
q.rowset.applyLocate( "id = " + nId )
//Goto the next record i.e the first record not already in the target
// table
q.rowset.next()
do while not q.rowset.endofset
q1.rowset.beginAppend() //add a blank record
//we can't place a value in an auto inc field so skip 1st field
for n = 2 to q.rowset.fields.size
if n = 2 //the image field
// Make sure you have the correct field here.
if file('temp_image') //Note: No dot
erase temp_image
endif
q.rowset.fields[n].copyToFile('temp_image.')
//Note: Dot at end of name
q1.rowset.fields[n].replaceFromFile('temp_image.')
else
q1.rowset.fields[n].value = q.rowset.fields[n].value
endif
next
q1.rowset.save() // save the new record
//go to the next record in the source table
q.rowset.next()
enddo
q.active = false
q1.active = false
******* End of program **********
Mervyn.
|
|