×
INTELLIGENT WORK FORUMS
FOR COMPUTER PROFESSIONALS

Log In

Come Join Us!

Are you a
Computer / IT professional?
Join Tek-Tips Forums!
  • Talk With Other Members
  • Be Notified Of Responses
    To Your Posts
  • Keyword Search
  • One-Click Access To Your
    Favorite Forums
  • Automated Signatures
    On Your Posts
  • Best Of All, It's Free!
  • Students Click Here

*Tek-Tips's functionality depends on members receiving e-mail. By joining you are opting in to receive e-mail.

Posting Guidelines

Promoting, selling, recruiting, coursework and thesis posting is forbidden.

Students Click Here

ExportXlsx 1.8 and CopyToXlsx 1.9.1
4

ExportXlsx 1.8 and CopyToXlsx 1.9.1

ExportXlsx 1.8 and CopyToXlsx 1.9.1

2
(OP)
Improved versions of class (ExportXlsx 1.8) and procedure (CopyToXlsx 1.9.1) that exports data from VFP into Excel 2007+ workbooks
The links from my blog (first link) contains some explanations

CopyToXlsx 2.9.1
direct link
CopyToXlsx 2.9.1

ExportXlsx 1.8
direct link
ExportXlsx 1.8

Respectfully,
Vilhelm-Ion Praisach
Resita, Romania

RE: ExportXlsx 1.8 and CopyToXlsx 1.9.1

This is really amazing - but there is a small bug in CopyToXlsx.
It always leaves 3 temporary cursors opened after execution...

RE: ExportXlsx 1.8 and CopyToXlsx 1.9.1

Very timely. I was just going to go looking for this.

RE: ExportXlsx 1.8 and CopyToXlsx 1.9.1

Very extremely cool. I love the VFPX.codeplex projects!! I can't figure out how to open an XLSX like you can when

CODE --> vfp

import from (myfile) TYPE XLS 
, but I love all the hard work and we all appreciate it guys!!

Dan

RE: ExportXlsx 1.8 and CopyToXlsx 1.9.1

Quote (drdolittle)

It always leaves 3 temporary cursors opened after execution...

Hmm,
I was always under the impression that cursors are by definition temporary and are getting disposed off on shutting down vfp or the exe. Am I wrong here?
Regards,
Jockey(2)

RE: ExportXlsx 1.8 and CopyToXlsx 1.9.1

No Jockey, you're not wrong, but only whern the session is closed. Simply imgine calling a function and afterward three cursors are in your datasession, that only were needed in the called function.
It's only a thing of tidy up. It can be useful to have some data still open, it can have negative sideeffecs if you scan a cursor and that's not selected after the function returns.

As drdolittle said, it's a small bug, as these extra cursors in themselves maybe not hurt, unless you have extra and unexepected cursors in code going through all open tables via AUSED() or anything like that. It's about the same thing if a function generates public variables and "pollutes" your memory with something not ordered.

Bye, Olaf.

RE: ExportXlsx 1.8 and CopyToXlsx 1.9.1

I'd say that it's always good practice to close a cursor when you have finished with it. Closing a cursor has the effect of deleting it from its temporary location, just like when you close the EXE or the VFP session. Leaving unwanted cursors lying around would probably do no harm, unless you call other functions or methods that happen to use the same cursor names. It's really a question of tidiness.

Mike

__________________________________
Mike Lewis (Edinburgh, Scotland)

Visual FoxPro articles, tips and downloads

RE: ExportXlsx 1.8 and CopyToXlsx 1.9.1

Olaf,
Mike,

Yes I know but whay does anyone wants to call this a bug????
I mean even if you leave all the cursors open in your application, agree, my mother also always cleans the kitchen after dinner was served, but the cleaning is done by VFP. Would you be able to give me an example why this 'untidiness' would harm your application? Realy this is not an acedemical question, nor one of a wise guy, just would like to know why someone 'dares' to comment on such a brilliant class with a bug, which is, again, to my opinion, not even there?

Jockey(2)

RE: ExportXlsx 1.8 and CopyToXlsx 1.9.1

I'd also call it a small bug, it's not being tidy, it's not being correct with the scoping of things. And while this will not harm on its own, it can influence furhter processings, as I already layed out.

A bug isn't just a bug, when it throws an error.

A book full of punctuation, grammar and spelling errors also "works", it's readable, but wouldn't you also call that buggy?

Bye, Olaf.

RE: ExportXlsx 1.8 and CopyToXlsx 1.9.1

Olaf,
I see you made a point. However one thing, would you be able to produce a sample where a created cursor, and not deleted after its use will throw a real error?
Thanks,
Regards,
Jockey(2)

RE: ExportXlsx 1.8 and CopyToXlsx 1.9.1

Hi,

Do you also call the fact that the variable llErr is not declared as local a bug?
According to https://simple.wikipedia.org/wiki/Software_bug not.
And not closing the cursors for me also not. I would rather call it sleazy in an otherwise brilliant procedure.

I fear this might come into an endless discussion, difference of opinion.

Regards,

Jockey(2)



RE: ExportXlsx 1.8 and CopyToXlsx 1.9.1

Quote:

Do you also call the fact that the variable llErr is not declared as local a bug?

No, because unless the variable is declared PUBLIC it will default to PRIVATE and will be automatically released at the end of the code that created it. LOCAL only impacts called code, not calling code.

Called generic code that alters state (SET TALK, SET EXACT, etc.), and state includes opened workareas, has a bug.

"The code is completely generic except it changed SET DATE and SET EXACT" is a description of buggy code. Generic code that leaves behind unexplained open cursors is the same thing.

This is not an insult to your code. Please don't take it that way. You just need to finish cleaning up.

I haven't looked at the code yet. What happens if it's called in a loop 200 times? Does it leave behind 600 open cursors?

RE: ExportXlsx 1.8 and CopyToXlsx 1.9.1

(OP)
Thank you for the kind words and for the feedback.
I am grateful for all suggestions and for the support seen here, especially when comes from programmers of your caliber.
I also appreciate any future suggestion.

Respectfully,
Vilhelm-Ion Praisach
Resita, Romania

RE: ExportXlsx 1.8 and CopyToXlsx 1.9.1

Jockey,

Dan has already answered, also I already stated where an additional cursor can influence further processing, assume you do AUSED and process any open cursor in some way, then an unexpected cursor not from you can disrupt your code. Whatever happens in your scope and is not the documented result or behaviour of a module you use is a bug, too.

For example I wrote database interfaces, classes quite like webservices that had methods like getRecipe(id,"crsRecipehead","crsIngredients"), that'll return cursors and then had the configuration option of tidyup .T. or .F., because additionally to the expected result cursors I might leave the underlying tables of the recipes open or close them. If a user of the interface knows he'll pull several recipes out, leaving tables open will make the whole loop faster.

So it can be useful to leave things open, if they are usable for the next call, but you better make that configurable.

This is not strictly about encapsulation, as that is more about the aspects of code separation and separation of concerns, but it tends to go into this regime. If the next call will CREATE CURSOR xyz again, you don't profit from the left open cursor and you also don't save time closing it, at some time it will be closed anyway.

Another simpler reason is, if you ever debugged code and you have more cursors open than the datasession window can show - even resized, then you're at a point where debugging is harder due to a cluttered datasession. A workaround is SELECT aliasname, if you know the alias name you want to browse, but it's easier with a tidy session, isn't it?

Bye, Olaf.

RE: ExportXlsx 1.8 and CopyToXlsx 1.9.1

Thanks a lot - the Dropbox links does not work (for me anyway) but engineering does so all is well :)

RE: ExportXlsx 1.8 and CopyToXlsx 1.9.1

This is a happy new year treat!

RE: ExportXlsx 1.8 and CopyToXlsx 1.9.1

Indeed a gem!
Thanks Vilhelm

Jockey(2)

RE: ExportXlsx 1.8 and CopyToXlsx 1.9.1

I'm very pleased to see this going forward.

Thanks!

Bye, Olaf.

RE: ExportXlsx 1.8 and CopyToXlsx 1.9.1

(OP)
Very kind words from all of you.
Thank you very much.

The same changes for the equivalent procedures that generates Word 2007+ respectively PowerPoint 2007+ documents (export to docx and export to pptx)

Please download the new versions, either from the attached archive, either from the links that points to my blog.
On my blog the properties of the classes are explained
CopyToDocx 2.0 (procedure)
ExportToDocx 2.0 (class)
CopyToPptx 2.0 (procedure)
ExportToPptx 2.0 (class)

or directly from the attached link (ExportToXlsx from this archive contains a very minor correction)

Respectfully,
Vilhelm-Ion Praisach
Resita, Romania

RE: ExportXlsx 1.8 and CopyToXlsx 1.9.1

(OP)
Also updated the importing procedures
- temporary tables are closed
- improved cleanup

Please download the new versions, either from the attached archive, either from the links that points to my blog.
My blog contains some explanations
Excel 2007+ -> DBF
Append from xlsx 2.0
Import from xlsx 2.0
Word 2007+ -> DBF
Append from docx 2.0
IMport from docx 2.0

or directly from the attached link

Respectfully,
Vilhelm-Ion Praisach
Resita, Romania

RE: ExportXlsx 1.8 and CopyToXlsx 1.9.1

Vilhelm-Ion.
I think I found a bug in row 576 in CopyToXlsx 3.0
If a datetime field is empty the follwing bombs:
lnTime = (m.ltTime-DATETIME(YEAR(m.ltTime),MONTH(m.ltTime),DAY(m.ltTime),0,0,0))/(86400.0)

RE: ExportXlsx 1.8 and CopyToXlsx 1.9.1

Bine!

RE: ExportXlsx 1.8 and CopyToXlsx 1.9.1

(OP)
CopyToDocx 2.1
CopyToPptx 2.1
CopyToXlsx 3.1
ExportToDocx 2.1
ExportToPptx 2.1
ExportToXlsx 2.1


1) Bug fixed for Windows older than Windows 7
When the folders are removed (the cleanup procedure). Most probably occurs on Windows Vista systems
Bug 1
2) Bug fixed (only for CopyToXlsx and ExportToXlsx)
Crashes for empty datetime values
Bug 2

Please download from
my blog
or
the attached archive

Thank you, once again, drdolittle

Respectfully,
Vilhelm-Ion Praisach
Resita, Romania

http://praisachion.blogspot.com/

RE: ExportXlsx 1.8 and CopyToXlsx 1.9.1

Hi Vilhelm-Ion, thanks for fast fixing.

I have ONE dbf that doesn't work though.
The xlsx is produced without errors but when Excel tries to open it, it says (something like):
Can't read all of the file. Should we try to repair it.
If I click Yes, Excel says it has erased some invalid xml elements, but the resulting file is unusable :(

Are you willing to test with my dbf and try to see what's going wrong?

RE: ExportXlsx 1.8 and CopyToXlsx 1.9.1

(OP)
Hi drdolittle,
Yes, please give me the dbf.

Respectfully,
Vilhelm-Ion Praisach
Resita, Romania

http://praisachion.blogspot.com/

RE: ExportXlsx 1.8 and CopyToXlsx 1.9.1

(OP)
Thank you smile
I hope will give a positive answer tomorrow.

Respectfully,
Vilhelm-Ion Praisach
Resita, Romania

http://praisachion.blogspot.com/

RE: ExportXlsx 1.8 and CopyToXlsx 1.9.1

I hope so too. BTW I use Excel 2010...

RE: ExportXlsx 1.8 and CopyToXlsx 1.9.1

(OP)
I've found the cause.
The memo field "distintern" contains some binary data for disnr = 2545. You may check that record, but I made a small change.
All I can do is to ignore the characters with ASCII < 32 (remove them from the resulted string, except CHR(9), CHR(10) and CHR(13))

Please download versions 2.2 / 3.2 from my blog
or from attached archive

Respectfully,
Vilhelm-Ion Praisach
Resita, Romania

http://praisachion.blogspot.com/

RE: ExportXlsx 1.8 and CopyToXlsx 1.9.1

You are like gold Vilhelm :)
Mulțumesc foarte mult!

RE: ExportXlsx 1.8 and CopyToXlsx 1.9.1

It feels like the new enhancements has made dbf2xls slower :(
I of course COULD go into the code and add some visual aid to let the user see the progress of the conversion, but then I have to do it all over if there is a new version. So I guess my question is: Is it too much to ask that you add some sort of progress bar?

RE: ExportXlsx 1.8 and CopyToXlsx 1.9.1

(OP)
I will look a little closer to it.
Also I've got a good suggestion from Koen Piller, that I must try.
It could speed up the entire process.
Just give me several days, please.

Respectfully,
Vilhelm-Ion Praisach
Resita, Romania

http://praisachion.blogspot.com/

RE: ExportXlsx 1.8 and CopyToXlsx 1.9.1

(OP)
I hope this week will have some spare time to make some adjustments. I tried yesterday, but I felt exhausted.
I apologize for the delay, but I really have much to work this weeks.

Respectfully,
Vilhelm-Ion Praisach
Resita, Romania

http://praisachion.blogspot.com/

RE: ExportXlsx 1.8 and CopyToXlsx 1.9.1

When one waits for something good you never waits too long :)

RE: ExportXlsx 1.8 and CopyToXlsx 1.9.1

Still waiting eagerly for faster conversion and (hopefully) also some sort of progressbar :)

RE: ExportXlsx 1.8 and CopyToXlsx 1.9.1

(OP)
Still without a progressbar.

Bug fixed
Restore the path

The archive contains
CopyToDocx 2.3
Improvements
- Up to 5% faster conversion
- new parameter llopen

CopyToPptx 2.3
Improvements
- Up to 5% faster conversion
- new parameter llopen

CopyToXlsx 3.3
Improvements
- Up to 5% faster conversion
- new parameter lnCodePage
- new parameter llopen

ExportToDocx 2.3
Improvements
- Up to 5% faster conversion
- new property lopen

ExportToPptx 2.3
Improvements
- Up to 5% faster conversion
- new property lopen

ExportToXlsx 2.3
Improvements
- Up to 5% faster conversion
- new property nCodePage
- new property lopen

Download link
Export DBF to MsOffice 2007+ (xlsx, docx, pptx) 2.3
or the attached zip

Respectfully,
Vilhelm-Ion Praisach
Resita, Romania

http://praisachion.blogspot.com/

RE: ExportXlsx 1.8 and CopyToXlsx 1.9.1

>Still without a progressbar

It would be easy to add at least an indeterminate marquee progressbar, but that can also be done from outside, is it does not need any callback or progress value:

CODE

PUBLIC oform1

oform1=NEWOBJECT("form1")
oform1.Show
RETURN

DEFINE CLASS form1 AS form
    Top = -2
    Left = 0
    Height = 85
    Width = 360
    ShowWindow = 2
    DoCreate = .T.
    Caption = "Progress Bar"
    Name = "Form1"
    AutoCenter = .T.
    
    ADD OBJECT oleprogress AS olecontrol WITH ;
        Top = 30, ;
        Left = 30, ;
        Height = 25, ;
        Width = 300, ;
        Name = "oleProgress", ;
        OleClass = "COMCTL.ProgCtrl.1"
        
    Add Object Timer1 as Timer WITH;
        Interval=30, ;
        Enabled=.T.
        

    PROCEDURE Init()
        #Define GWL_STYLE -16
        #Define WM_USER 0x0400
        #Define WS_VISIBLE 0x10000000
        #Define WS_CHILD 0x40000000

        #Define PBM_SETRANGE 0x0401
        #Define PBM_SETPOS 0x0402
        #Define PBM_DELTAPOS 0x0403
        #Define PBM_SETSTEP 0x0404
        #Define PBM_STEPIT 0x0405
        #Define PBM_SETRANGE32 0x0406
        #Define PBM_GETRANGE 0x0407
        #Define PBM_GETPOS 0x0408
        #Define PBM_SETBARCOLOR 0x0409
        #Define PBM_SETBKCOLOR 0x2001
        #Define PBM_SETMARQUEE 0x040A
        #Define PBM_GETSTEP 0x040D
        #Define PBM_GETBKCOLOR 0x040E
        #Define PBM_GETBARCOLOR 0x040F
        #Define PBM_SETSTATE 0x0410
        #Define PBM_GETSTATE 0x0411

        #Define PBS_SMOOTH 0x01
        #Define PBS_VERTICAL 0x04
        #Define PBS_MARQUEE 0x08
        #Define PBS_SMOOTHREVERSE 0x10

        #Define PBST_NORMAL 0x0001
        #Define PBST_ERROR 0x0002
        #Define PBST_PAUSED 0x0003

        LOCAL lnStyle, lnReturn, lnState

        Declare Integer SendMessage In user32 Integer, Integer, Integer, Integer
        Declare Integer SetWindowLong In WIN32API Integer, Integer, Integer

        m.lnStyle = Bitor(WS_CHILD, WS_VISIBLE, PBS_MARQUEE)
        SetWindowLong(This.oleProgress.Object.HWnd, GWL_STYLE, m.lnStyle)
        * SendMessage(This.oleProgress.Object.HWnd, PBM_SETMARQUEE, 1, 30) && does not work in Win7
    EndProc
    
    Procedure Timer1.Timer()
        Thisform.oleprogress.Value=0
    ENDPROC
ENDDEFINE 

RE: ExportXlsx 1.8 and CopyToXlsx 1.9.1

(OP)
Thank you for the progressbar.

There are a few time consuming processes:
1 populating a cursor containing the strings and generate the corresponding XML (to avoid duplicates)
2 creating the main XML (that describe the sheet)
3 compressing all the files

The first mentioned process also can be partial, if the table contains memo fields, because memo are processed when is created the main XML.
And the third process has it's own progressbar.
Maybe the solution is to show the progressbar two times, starting for each step from zero.
If you insist I could add a new parameter for showing a progressbar, because I'm pretty sure it will cost some additional time.

Respectfully,
Vilhelm-Ion Praisach
Resita, Romania

http://praisachion.blogspot.com/

RE: ExportXlsx 1.8 and CopyToXlsx 1.9.1

>it will cost some additional time.
The main secret to make showing progress fast is not drawing it every iteration.

You know that, you were even much involved in getting my last self made progress bar show smoothly in thread184-1737918: Refreshing form smoother via Cls than Refresh. Why?
I introduced a lastpaint property there, updated in the paint event and checked in the cls method:

CODE

If Seconds()-Thisform.lastpaint<1/50
   Nodefault
Endif 

I often see and also recommend using counter modulus 10 or 100 or 1000. Waiting for a time passed is making it smooth enough and taking less time itself. And it automatically adjusts to computers becoming faster and adjusts at the frame rate for a smooth display. You can also decide to only update once a second or even less in longer running processes. It doesn't always need a 50 frames per second rate.

Rule of thumb is starting a progress display first only after a process already runs for 3 seconds anyway, so every short running process has no bar at all.

Bye, Olaf.

RE: ExportXlsx 1.8 and CopyToXlsx 1.9.1

>If you insist I could add a new parameter for showing a progressbar, because I'm pretty sure it will cost some additional time.

That sounds good!

RE: ExportXlsx 1.8 and CopyToXlsx 1.9.1

(OP)
With the courtesy of Olaf Doschke, finally I made this change.
I apologize for the delay, but I must finish a project this first semester of the year, and I'm a little overwhelmed.

Improvements
- the speed is increased with 0-5% (it depends)
- new parameter llPBar; when .T. a progressbar is displayed (the speed could decrease with about 10%)

I made the changes only to copytoxlsx procedure.
If the feedback is positive, then I will add the same feature to all other exporting procedures / classes.

Respectfully,
Vilhelm-Ion Praisach
Resita, Romania

http://praisachion.blogspot.com/

RE: ExportXlsx 1.8 and CopyToXlsx 1.9.1

Beautiful - thanks!

RE: ExportXlsx 1.8 and CopyToXlsx 1.9.1

(OP)
ImportFromXlsx 2.2

Improved effect of "llEmptyCells" parameter
(See test5.prg)

1. Detect the data type of the column from the first non-empty cell of each column
2. Preserve values when a column contains mixed values (don't loose values)
3. Detect columns after the rightmost continue column, from the point of view of the first imported row

Respectfully,
Vilhelm-Ion Praisach
Resita, Romania

http://praisachion.blogspot.com/

RE: ExportXlsx 1.8 and CopyToXlsx 1.9.1

(OP)
ImportFromPptx 1.0

Tries to mimic the native Import command
Creates / overwrites a DBF table, with the same name of the pptx
The field type are guessed from the first imported row (depends on lnStartRows, the starting row)

Parameters
lcFileName    name of the pptx
lnSlide       slide# ; optional ; default 1
lnStartRows   starting row (the first lnStartRows - 1 rows are skipped) ; optional ; default 1 (all rows)
lnTable       table# ; optional ; default 1
lcTrue        the text representing "true" for boolean fields ; optional default "true"
lcFalse       the text representing "false" for boolean fields ; optional default "false"
llCursor      when .T., the result is a cursor instead of a DBF ; optional ; default .F.
lnHeader      table headers row number; optional ; default 0 

Alternative link for download

Respectfully,
Vilhelm-Ion Praisach
Resita, Romania

http://praisachion.blogspot.com/

RE: ExportXlsx 1.8 and CopyToXlsx 1.9.1

(OP)
ImportFromXlsx 3.1

Bugs fixed:
- when lnHeader > 0 and the number of table header is bigger than the number of follosing rows
- when number of columns > 254

Improvements
- if the sheet starts with other column than A and llEmptyCells = true, now the generated table is without empty columns A,B,...
- Messages in Dutch (thanks to Koen Piller)

Respectfully,
Vilhelm-Ion Praisach
Resita, Romania

http://praisachion.blogspot.com/

RE: ExportXlsx 1.8 and CopyToXlsx 1.9.1

(OP)
ImportFromPptx 1.1

Bug fixed
- correct name of the lcFalse parameter

Improvements

- The number of columns is not depending anymore on the firs row (read all cell, no matter how the first row is)
- Process complex tables layout, with merged cells (merged cells are placed in the right columns)
- Letters with accents are correctly imported (apply STRCONV() to strings - suggested by Koen Piller)
- Messages in DUTCH (suggested by Koen Piller)

Download link
ImportFromPptx 1.1

Respectfully,
Vilhelm-Ion Praisach
Resita, Romania

http://praisachion.blogspot.com/

RE: ExportXlsx 1.8 and CopyToXlsx 1.9.1

(OP)
ImportFromDocx 3.1

Bug fixed
- correct name of the lcFalse parameter

Improvements
- The number of columns is not depending anymore on the firs row (read all cell, no matter how the first row is)
- Process complex tables layout, with merged cells (merged cells are placed in the right columns)
- Letters with accents are correctly imported (apply STRCONV() to strings - suggested by Koen Piller)
- Messages in DUTCH (suggested by Koen Piller)

Download link
ImportFromDocx 3.1

Respectfully,
Vilhelm-Ion Praisach
Resita, Romania

http://praisachion.blogspot.com/

RE: ExportXlsx 1.8 and CopyToXlsx 1.9.1

(OP)
AppendFromDocx 2.1

Bug fixed
- correct name of the lcFalse parameter

Improvements
- The number of columns is not depending anymore on the firs row (read all cell, no matter how the first row is)
- Process complex tables layout, with merged cells (merged cells are placed in the right columns)
- Letters with accents are correctly imported (apply STRCONV() to strings - suggested by Koen Piller)
- Messages in DUTCH (suggested by Koen Piller)

The main difference between Import and Append is that Import creates a new table, while append add records to an opened table

Download link
AppendFromDocx 2.1

Respectfully,
Vilhelm-Ion Praisach
Resita, Romania

http://praisachion.blogspot.com/

RE: ExportXlsx 1.8 and CopyToXlsx 1.9.1

(OP)
AppendFromPptx 1.0

First version
With the same possibilities
- The number of columns is not depending on the firs row (read all cell, no matter how the first row is)
- Process complex tables layout, with merged cells (merged cells are placed in the right columns)
- Letters with accents are correctly imported (apply STRCONV() to strings - suggested by Koen Piller)
- Messages in DUTCH (suggested by Koen Piller)

The main difference between Import and Append is that Import creates a new table, while append add records to an opened table

Download link
AppendFromPptx 1.0

Respectfully,
Vilhelm-Ion Praisach
Resita, Romania

http://praisachion.blogspot.com/

Red Flag This Post

Please let us know here why this post is inappropriate. Reasons such as off-topic, duplicates, flames, illegal, vulgar, or students posting their homework.

Red Flag Submitted

Thank you for helping keep Tek-Tips Forums free from inappropriate posts.
The Tek-Tips staff will check this out and take appropriate action.

Reply To This Thread

Posting in the Tek-Tips forums is a member-only feature.

Click Here to join Tek-Tips and talk with other members! Already a Member? Login

Close Box

Join Tek-Tips® Today!

Join your peers on the Internet's largest technical computer professional community.
It's easy to join and it's free.

Here's Why Members Love Tek-Tips Forums:

Register now while it's still free!

Already a member? Close this window and log in.

Join Us             Close