Want to protect your cyber security and still get fast solutions? Ask a secure question today.Go Premium

x
?
Solved

export wordperfect 8 file to file from FoxPro General Field

Posted on 2009-12-30
34
Medium Priority
?
726 Views
Last Modified: 2013-12-26
this question follows a previous question that I posted last week. I am having issues getting a Word Perfect 8 file to export from foxpro to a file (of any type). I used the saveas of a word object to successfully save a word document from the same general field. but when I open the word perfect from the general field as an OLE object on a form and try to use the saveas, it doesnt do anything at all. I will include sample code below. the sample code works with MS Word documents, but not Word Perfect.

Thanks!
&& create the OLE object
loForm = CREATEOBJECT("Form")
			 
loForm.addobject("oleboundcontrol1", "oleboundcontrol") 

loForm.oleboundcontrol1.autosize = .T. 

* bind general field to oleboundcontrol 
loForm.oleboundcontrol1.controlsource = "inspctn.gnarrative" 

* save data from general field to a generic file type 
loForm.oleboundcontrol1.saveas("c:\TestFolder\" + inspctn.ciulkey + ".x")

Open in new window

0
Comment
Question by:Maelificus
  • 18
  • 16
34 Comments
 
LVL 43

Expert Comment

by:pcelba
ID: 26146326
It seems we are back in General to Memo data type change:

USE inspctn 
*-- Locate some record containing non empty General field 
LOCATE FOR !EMPTY(gnarrative) 
 
COPY NEXT 1 FIELD gnarrative TO testgen.dbf 
 
lnH = FOPEN('testgen.dbf', 2) 
= FSEEK(lnH,43) 
IF FREAD(lnH,1) = "G" 
  = FSEEK(lnH,43) 
  = FWRITE(lnH,"M") 
  ? "Success" 
ENDIF 
= FCLOSE(lnH) 
 
USE testgen 

lcWPF = CHR(0xFF)+CHR(0x57)+CHR(0x50)+CHR(0x43)

IF lcWPF $ gnarrative
  lcDoc = SUBSTR(gnarrative, AT(lcWPF, gnarrative))
  = STRTOFILE(lcDoc, "c:\TestFolder\" + inspctn.ciulkey + ".x")
ELSE
  *-- Probably not WPF
ENDIF

USE

Open in new window

0
 

Author Comment

by:Maelificus
ID: 26146594
well, I incorperated your code into my code and it didnt find anything that was word perfect(im assuming that is what you  were trying to do?
 
0
 
LVL 43

Expert Comment

by:pcelba
ID: 26146651
Well it could depend on the General field creation. Do you use LINK keyword in APPEND GENERAL or is the WPF file embeded in the General field?

My sample code should work for embeded document and - important thing which you probably know - it does copy just the first existing record from inspctn table.
0
Industry Leaders: We Want Your Opinion!

We value your feedback.

Take our survey and automatically be enter to win anyone of the following:
Yeti Cooler, Amazon eGift Card, and Movie eGift Card!

 
LVL 43

Expert Comment

by:pcelba
ID: 26146782
So, the code works for embeded Word document. Wordperfect should use same logic (I hope). It could help if you would post some DBF samples.

If your documents are linked then you have to find out the file name in the memo field and use it as document reference.

The SaveAs feature is not available for all possible objects types.
0
 

Author Comment

by:Maelificus
ID: 26147623
sorry, I went to lunch.
Regarding your first reply: I dont know what was done when the files were imported into the DB. this was done ages ago (before my time here) noone else seems to know either.
Regarding your second reply: Yes, the code I posted works for MS Word, but it doesn't work for Word Perfect. no clue why, since the General field IS OLE based. (or so I read) Unfortunately the data is not available for public eyes, I cannot post the DBF here, I wish I could!
also...I am a total newbie to FoxPro, I have never touched it before last week. I do recognize a lot of syntax, because I am a programmer. I was able to export the general file using this: http://support.microsoft.com/kb/q161832/ 
I just changed the file type to WPD, but I think some information was stripped because of the 599 offset. No clue about the offset stuff though.. so I gave up on that, looking for a different method.
 
0
 
LVL 43

Expert Comment

by:pcelba
ID: 26147860
Yes, the offset can be valid for BMP only.

You wrote "I incorperated your code into my code and it didnt find anything that was word perfect". Did you update my code from answer ID:26146326 somehow? Could you post your code?
0
 
LVL 43

Expert Comment

by:pcelba
ID: 26148003
BTW, I've been testing BMP and the offset is 727 in my case... Offset for Word file is different and it seems to depend on the original file path. So, the only way is to look for Word/WordPerfect heading ID bytes as shown in ID:26146326
0
 

Author Comment

by:Maelificus
ID: 26148104
sorry, what is that ID you are refering to?
and, when I said I incorperated your code into mine, I deleted a large portion of my code to run yours (your first post in this thread)
I will post my entire code ... see the new attached code file  in this thread.
0
 

Author Comment

by:Maelificus
ID: 26148126
for some reason, it didnt add the code...
USE C:\BSG\DATA\inspctn.dbf
RECNO(166)
GO 166
SCAN WHILE RECNO() > 165
	generalFileName = "c:\TestFolder\" + inspctn.ciulkey
	newFileName = generalFileName
	 
	IF (ISBLANK(inspctn.ciulkey))
	inspectionDate = SUBSTR(STRTRAN(TTOC(inspctn.dinspdate), "/", "-"),1,8)
	generalFileName = "c:\TestFolder\_" + STRTRAN(inspctn.cinspkey, " ", "") + "_" + STRTRAN(inspctn.cpermit, " ", "") + "_" + inspectionDate
	newFileName = generalFileName
	ENDIF
	IF (ISBLANK(inspctn.Gnarrative) = .F.)		
		&& create the OLE object
		loForm = CREATEOBJECT("Form")
		
		* - create the word object - 
		oWord = CREATEOBJECT("Word.Application") 
		 
		loForm.addobject("oleboundcontrol1", "oleboundcontrol") 
		loForm.oleboundcontrol1.autosize = .T. 
		* bind general field to oleboundcontrol 
		loForm.oleboundcontrol1.controlsource = "inspctn.gnarrative" 
		* save data from general field to a generic file type   
		loForm.oleboundcontrol1.saveas(generalFileName + ".x") 
		
		lnH = FOPEN(generalFileName + ".x") 
		lcHdr = FREAD(lnH, 3)
		=FCLOSE(lnH) 

		fileIncrement = 0
		
		&& the following case statements check the Hexadecimal values of the files - 
		&& - to determine if they are .doc or .wpd files
		DO CASE 
			CASE ASC(lcHdr) = 0xD0 AND ASC(SUBSTR(lcHdr, 2, 1)) = 0xCF AND ASC(SUBSTR(lcHdr, 3, 1)) = 0x11 
				&&		 Word .DOC file
				IF(FILE(generalFileName + "_2.doc"))
					&& This loop should take care of the duplicate ciulkey entries
					DO WHILE(FILE(newFileName + "_2.doc"))
						fileIncrement = fileIncrement + 1
						newFileName = generalFileName + "-" + STR(fileIncrement, 1)
					ENDDO
					RENAME generalFileName + ".x" TO newFileName + "_2.doc"
				ELSE			
					RENAME generalFileName + ".x" TO newFileName + "_2.doc"
				ENDIF
				&& The part below will correct the 3 x 11 page size to 8-1/2 x 11 if it is a word document					 
				oWord.Documents.Open(newFileName + "_2.doc") 
				oWord.ActiveDocument.PageSetup.PageWidth = "8.5"
				oWord.ActiveDocument.PageSetup.PageHeight = "11"
				oWord.Activedocument.saveas(newFileName + "_2.doc")
				oWord.Activedocument.close
				oWord.Application.quit
			&&         Word Perfect .WPF file	
			CASE ASC(lcHdr) = 0xFF AND ASC(SUBSTR(lcHdr, 2, 1)) = 0x57 AND ASC(SUBSTR(lcHdr, 3, 1)) = 0x50 AND ASC(SUBSTR(lcHdr, 2, 1)) = 0x43 
				IF(FILE(generalFileName + "_2.wpd"))
					&& This loop should take care of the duplicate ciulkey entries
					DO WHILE(FILE(newFileName + "_2.wpd"))
						fileIncrement = fileIncrement + 1
						newFileName = generalFileName + "-" + STR(fileIncrement, 1)
					ENDDO
					RENAME generalFileName + ".x" TO newFileName + "_2.wpd"
				ELSE			
					RENAME generalFileName + ".x" TO newFileName + "_2.wpd"	
				ENDIF					
			OTHERWISE 
				*-- Unknown file 
		ENDCASE
		
	ENDIF
	IF (ISBLANK(inspctn.Mnarrative) = .F.)
		STRTOFILE(Mnarrative, newFileName + "_1.txt")
	ENDIF
	RELEASE oWord
	RELEASE loForm
ENDSCAN

Open in new window

0
 

Author Comment

by:Maelificus
ID: 26148176
just so we are clear, THAT code is unaltered... when I added your code, I took out all the word document stuff and the loForm object code... just to have it run against the DB for Word Perfect documents.
The code below shows that:

**test program for Word Perfect Extraction**

USE C:\BSG\DATA\inspctn.dbf
RECNO(188)
GO 188
SCAN WHILE RECNO() > 187
	generalFileName = "c:\TestFolder\" + inspctn.ciulkey
	newFileName = generalFileName
	 
	IF (ISBLANK(inspctn.ciulkey))
	inspectionDate = SUBSTR(STRTRAN(TTOC(inspctn.dinspdate), "/", "-"),1,8)
	generalFileName = "c:\TestFolder\_" + STRTRAN(inspctn.cinspkey, " ", "") + "_" + STRTRAN(inspctn.cpermit, " ", "") + "_" + inspectionDate
	newFileName = generalFileName
	ENDIF
	IF (ISBLANK(inspctn.Gnarrative) = .F.)		
		USE C:\BSG\DATA\inspctn.dbf
*-- Locate some record containing non empty General field  
&&LOCATE FOR !EMPTY(gnarrative)  
  
COPY NEXT 1 FIELD gnarrative TO testgen.dbf  
  
lnH = FOPEN('testgen.dbf', 2)  
= FSEEK(lnH,43)  
IF FREAD(lnH,1) = "G"  
  = FSEEK(lnH,43)  
  = FWRITE(lnH,"M")  
  ? "Success"  
ENDIF  
= FCLOSE(lnH)  
  
USE testgen  
 
lcWPF = CHR(0xFF)+CHR(0x57)+CHR(0x50)+CHR(0x43) 
 
IF lcWPF $ gnarrative 
  lcDoc = SUBSTR(gnarrative, AT(lcWPF, gnarrative)) 
  = STRTOFILE(lcDoc, "c:\TestFolder\" + inspctn.ciulkey + ".x") 
ELSE 
  *-- Probably not WPF 
ENDIF 
	ENDIF
ENDSCAN

Open in new window

0
 
LVL 43

Expert Comment

by:pcelba
ID: 26148377
So, I've fixed a few problematic parts and restricted the loop to records 188 - 199. It should extract both Word and Wordperfect files.

The most problematic part was the USE command just after IF (ISBLANK(inspctn.Gnarrative) = .F.). It caused reopening the inspctn.dbf table and setting its record number to 1.

Don't hesitate to ask if you would like to explain some changes.
**test program for Word Perfect Extraction** 
 
USE C:\BSG\DATA\inspctn.dbf 
*RECNO(188) 
GO 188 
SCAN WHILE RECNO() > 187  AND RECNO() < 200
  generalFileName = "c:\TestFolder\" + inspctn.ciulkey 
  newFileName = generalFileName 
          
  IF (ISBLANK(inspctn.ciulkey)) 
    inspectionDate = SUBSTR(STRTRAN(TTOC(inspctn.dinspdate), "/", "-"),1,8) 
    generalFileName = "c:\TestFolder\_" + STRTRAN(inspctn.cinspkey, " ", "") + "_" + STRTRAN(inspctn.cpermit, " ", "") + "_" + inspectionDate 
    newFileName = generalFileName 
  ENDIF 
  IF (ISBLANK(inspctn.Gnarrative) = .F.)           

*                USE C:\BSG\DATA\inspctn.dbf 

*-- Locate some record containing non empty General field   
&&LOCATE FOR !EMPTY(gnarrative)   
   
    COPY NEXT 1 FIELD gnarrative TO c:\TestFolder\testgen.dbf   
    
    lnH = FOPEN('testgen.dbf', 2)   
    = FSEEK(lnH,43)   
    IF FREAD(lnH,1) = "G"   
      = FSEEK(lnH,43)   
      = FWRITE(lnH,"M")   
      *? "Success"   
    ENDIF   
    = FCLOSE(lnH)   

    SELECT 0   
    USE c:\TestFolder\testgen.dbf
  
    lcWPF = CHR(0xFF)+CHR(0x57)+CHR(0x50)+CHR(0x43)  
    lcWord = CHR(0xD0)+CHR(0xCF)+CHR(0x11)
  
    DO CASE
    CASE lcWPF $ gnarrative  
      lcDoc = SUBSTR(gnarrative, AT(lcWPF, gnarrative))  
      = STRTOFILE(lcDoc, newFileName)  
      ? RECNO('inspctn'), "WPF", newFileName
    CASE lcWord $ gnarrative  
      lcDoc = SUBSTR(gnarrative, AT(lcWord, gnarrative))  
      = STRTOFILE(lcDoc, newFileName)  
      ? RECNO('inspctn'), "Word", newFileName
    OTHERWISE
      *-- Unknown format
      ? RECNO('inspctn'), "Unknown format"
    ENDCASE
    
    USE
    
  ENDIF 

ENDSCAN

Open in new window

0
 
LVL 43

Expert Comment

by:pcelba
ID: 26148402
The ID I am referring to is that one assigned to each post here. It can be used as message identification. The previous message has ID:26148377. This one... who knows?
0
 

Author Comment

by:Maelificus
ID: 26148719
thanks for that explanation :)
as far as your new code....
It does export 12 files (no extension) but wordperfect 8 doesnt recognize it at all. word 2007 will read it, but states that it is attempting to convert the file from Word Perfect 6.x -> 7. it also says that the file seems corrupt and may have a loss of info (i verified the info in the files against the DB, and all seems good, but that makes me nervous.)
question... how would I get rid of it asking me to over to overwrite the testGen.dbf ?
 
0
 
LVL 43

Expert Comment

by:pcelba
ID: 26148834
The output filename (with no extension) is obtained from the generalFileName variable. You may change the expression which creates it and add some extension.

To suppress file overwrite questions add SET SAFETY OFF command to your code.

And the main problem... We have several options:

If the general field was created with the LINK keyword then it means all files are somewhere on the disk, the general field does not contain everything and the export creates incomplete file.  I suppose you would probably know if files are somewhere on the disk. If you look inside the memo field in testGen.dbf you should see the file name somewhere at the beginning.

Another option is the exported file is too long. ABove code is extracting the whole memo contents from heading identification string to the end. Maybe WordPerfect requires exact file size. If you have Wordperfect you could create some test file, insert it into general field and extract by my code.

Is the Wordperfect ole object displayed correctly in FoxPro?

0
 

Author Comment

by:Maelificus
ID: 26148871
ok I will take a look at that stuff.
yes FoxPro displays the viewer version of the file, and if I double-click once more, it displays the file in Wordperfect.
0
 

Author Comment

by:Maelificus
ID: 26148888
Meant to say, if I double-click once more ON THE VIEWER in FoxPro :)
0
 

Author Comment

by:Maelificus
ID: 26149032
would you mind explaining the FREAD, FSEEK, FWRITE portion of your code? i think I understand it.. basically, but i want to be sure. :)
0
 
LVL 43

Expert Comment

by:pcelba
ID: 26149062
If the WordPerfect appears then the filename should be visible in its title bar. It also means the file is LINKED and it is stored on the disk and you cannot extract it from database (the linked file extraction is impossible).
0
 
LVL 43

Expert Comment

by:pcelba
ID: 26149151
Another hints which could help:

If loForm.oleboundcontrol1.documentfile  contains filename and path the the file is linked from disk.
loForm.oleboundcontrol1.oleclass  contains file type.
0
 

Author Comment

by:Maelificus
ID: 26149165
ok, well there is no filename for any of the files I opened in FoxPro other than Document 2. so that means they are not LINKED, correct?
0
 
LVL 43

Expert Comment

by:pcelba
ID: 26149193
Some comments to my code:

*-- Copy general field from one record into a separate data table:
    COPY NEXT 1 FIELD gnarrative TO c:\TestFolder\testgen.dbf    
*-- Open the table by low level file function    
    lnH = FOPEN('testgen.dbf', 2)    
*-- Set the file pointer to the byte 43 (zero based). It contains field type (valid for table having one field only).
    = FSEEK(lnH,43)    
*-- If the field type is G(eneral) - just to be sure we are on the right place
    IF FREAD(lnH,1) = "G"    
*-- set the file pointer to the byte 43 again (previous FREAD moved it one byte)
      = FSEEK(lnH,43)    
*-- change the field type to M(emo) by writting "M" character
      = FWRITE(lnH,"M")    
      *? "Success"    
    ENDIF    
*-- Close the c:\TestFolder\testgen.dbf    
    = FCLOSE(lnH)    

*-- Select free work area
    SELECT 0    
*-- Open the c:\TestFolder\testgen.dbf  and process the general field as memo
    USE c:\TestFolder\testgen.dbf

0
 
LVL 43

Expert Comment

by:pcelba
ID: 26149282
If there is no filename then it should mean the file is embeded (stored in general field). In such case you could try to create a small table containing one general field:

CREATE TABLE tstGen (someole G)
APPEND BLANK
APPEND GENERAL someole FROM '<SomeSmallWordPerfect.DOC>'
USE

and post tstGen.DBF + tstGen.FPT file here. (You have to append additional extension .TXT to filenames)
0
 

Author Comment

by:Maelificus
ID: 26149415
unfortunately I have to go for the day, I am not returning until Tuesday. I would like to continue this at that time, although you have helped tremendously and I would be happy to give you credit if you like.
I have posted the files you asked for, although it looks like garbage in the field (it says memo ) ?
 If I dont hear back that you would rather not continue this problem , I will talk with you next week. if so, I will assign the points and call it good :)
either way, have a wonderful New Year ! :)
-Jason

tstGen.DBF.txt
tstGen.FPT.txt
0
 
LVL 43

Expert Comment

by:pcelba
ID: 26149563
Interesting the general field contains both Word and WordPerfect heading. The question is if it was added by FoxPro or if it is in the file

The original file would be helpful also.

And yes, we may continue next week.

Happy New Year!
0
 

Author Comment

by:Maelificus
ID: 26180914
Thank you! : )
 
Here is the original file you requested. I hope it helps !

TESTBSG.wpd.txt
0
 
LVL 43

Expert Comment

by:pcelba
ID: 26181219
It seems the WordPerfect file is wrapped in General field as Word document... It should be possible to extract it. I may just guess if the four bytes just before WP heading represent the WP file size... If yes then solution is easy...

Could you please create one more sample (DBF, FPT, WPD) with different WP file?
0
 
LVL 43

Accepted Solution

by:
pcelba earned 2000 total points
ID: 26181982
I've updated the code posted previously and it should reflect the file size stored just before document heading in General field. It also adds extension to the output filename.
**test program for Word Perfect Extraction** 
 
USE C:\BSG\DATA\inspctn.dbf 
*RECNO(188) 
GO 188 
SCAN WHILE RECNO() > 187  AND RECNO() < 200
  generalFileName = "c:\TestFolder\" + inspctn.ciulkey 
  newFileName = generalFileName 
          
  IF (ISBLANK(inspctn.ciulkey)) 
    inspectionDate = SUBSTR(STRTRAN(TTOC(inspctn.dinspdate), "/", "-"),1,8) 
    generalFileName = "c:\TestFolder\_" + STRTRAN(inspctn.cinspkey, " ", "") + "_" + STRTRAN(inspctn.cpermit, " ", "") + "_" + inspectionDate 
    newFileName = generalFileName 
  ENDIF 
  IF (ISBLANK(inspctn.Gnarrative) = .F.)           

*                USE C:\BSG\DATA\inspctn.dbf 

*-- Locate some record containing non empty General field   
&&LOCATE FOR !EMPTY(gnarrative)   
   
    COPY NEXT 1 FIELD gnarrative TO c:\TestFolder\testgen.dbf   
    
    lnH = FOPEN('testgen.dbf', 2)   
    = FSEEK(lnH,43)   
    IF FREAD(lnH,1) = "G"   
      = FSEEK(lnH,43)   
      = FWRITE(lnH,"M")   
      *? "Success"   
    ENDIF   
    = FCLOSE(lnH)   

    SELECT 0   
    USE c:\TestFolder\testgen.dbf
  
    lcWPF = CHR(0xFF)+CHR(0x57)+CHR(0x50)+CHR(0x43)  
    lcWord = CHR(0xD0)+CHR(0xCF)+CHR(0x11)
  
    DO CASE
    CASE lcWPF $ gnarrative 
      lcDoc = SUBSTR(gnarrative, AT(lcWPF, gnarrative)-4, 4)
      lnDocLen = ASC(lcDoc) + 256*ASC(SUBSTR(lcDoc, 2)) + 256*256*ASC(SUBSTR(lcDoc, 3)) + 256*256*256*ASC(SUBSTR(lcDoc, 4))
      lcDoc = SUBSTR(gnarrative, AT(lcWPF, gnarrative), lnDocLen)
      newFileName = FORCEEXT(newFileName, 'WPD')
      = STRTOFILE(lcDoc, newFileName)
      ? RECNO('inspctn'), "WPF", newFileName
    CASE lcWord $ gnarrative
      lcDoc = SUBSTR(gnarrative, AT(lcWord, gnarrative)-4, 4)
      lnDocLen = ASC(lcDoc) + 256*ASC(SUBSTR(lcDoc, 2)) + 256*256*ASC(SUBSTR(lcDoc, 3)) + 256*256*256*ASC(SUBSTR(lcDoc, 4))
      lcDoc = SUBSTR(gnarrative, AT(lcWord, gnarrative), lnDocLen)
      newFileName = FORCEEXT(newFileName, 'DOC')
      = STRTOFILE(lcDoc, newFileName)
      ? RECNO('inspctn'), "Word", newFileName
    OTHERWISE
      *-- Unknown format
      ? RECNO('inspctn'), "Unknown format"
    ENDCASE
    
    USE
    
  ENDIF 

ENDSCAN

Open in new window

0
 

Author Comment

by:Maelificus
ID: 26183426
I appologize, I have been busy this morning and after lunch.
I am trying to run it now but it is failing on the line: CASE lcWPF & gnarrative
Message:  Function argument value, type, or count is invalid.
0
 
LVL 43

Expert Comment

by:pcelba
ID: 26183520
Please SET DEFAULT TO c:\TestFolder

or add path to   lnH = FOPEN('testgen.dbf', 2)
0
 

Author Comment

by:Maelificus
ID: 26183813
Ok, WP still doesnt recognize this file at all (unknown File Format), but Word will open it without complaints now!!!
I am going to ask management if we can just use word to view these or not. Hopefully they will agree.
0
 
LVL 43

Expert Comment

by:pcelba
ID: 26183964
Interesting, but without more samples it is not easy to investigate this problem. WPF document is somehow wrapped into Word envelope in general field and the program extracts just the WPF part. The question is what everything was changed before storing the WPF document into the general field.

I could install some Corel WPF Office trial but who knows if it would bring better result...

You should also make sure all files are complete and readable before you decide to delete the file containing general fields.
0
 

Author Comment

by:Maelificus
ID: 26184182
ok, I think this is going to work for management. I just have some cleanup work to do since my code for Word and the Memo (*.txt) field are a little different than what you have provided.
I greatly appreciate all your help!!! you are a foxpro god! : )
Thank you so much!
0
 

Author Closing Comment

by:Maelificus
ID: 31671230
pcelba was a fantastic help, and was very patient with me. :)
Thanks again!
0
 
LVL 43

Expert Comment

by:pcelba
ID: 26184905
Not god, just wizard :-)

You are welcome!
0

Featured Post

Industry Leaders: We Want Your Opinion!

We value your feedback.

Take our survey and automatically be enter to win anyone of the following:
Yeti Cooler, Amazon eGift Card, and Movie eGift Card!

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

Microsoft Visual FoxPro (short VFP) is a programming language with it’s own IDE and database, ranking somewhat between Access and VB.NET + SQL Server (Express). Product Description: http://msdn.microsoft.com/en-us/vfoxpro/default.aspx (http://msd…
The number of companies understanding the potential of IoT on B2B market is growing with each day. And yet only a small share of IoT developers have managed to equalize incomes and stay competitive in the international market.
This video walks the viewer through the process of creating envelopes and labels, with multiple names and addresses. Navigate to the “Start Mail Merge” button in the Mailings tab: Follow the step-by-step process until asked to find the address doc…
The viewer will learn how to  create a slide that will launch other presentations in Microsoft PowerPoint. In the finished slide, each item launches a new PowerPoint presentation and when each is finished it automatically comes back to this slide: …
Suggested Courses

581 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question