About Me

My photo
Over nine years of research experience in social science and public health research, who specializes large scale survey design and analysis, and data quality in various forms and tools of research work with Quantitative as well as Qualitative techniques and then last five years I have developed data entry and tabulation package in CSPro for various large scale surveys in India as well outside India. Presently I am working as Consultant State Data Manager in UNICEF Chhattisgarh (Through PDCSL).

Tuesday, April 5, 2011

Using execsystem to Retrieve a Computer's Username

visit counter for blogspot

An example of when this could be useful is if you want to create a PFF file with the data file named after the login ID of the keyer who has logged onto that machine.

PROC GLOBAL


alpha (20) tempFilename = "tempusername.txt";

alpha (300) str;

FILE inputFile;

alpha (50) username;


PROC EXAMPLE

execsystem(maketext('cmd /c "set username > %s"',strip(tempFilename)),wait);

setfile(inputFile,strip(tempFilename));

fileread(inputFile,str);

close(inputFile);

filedelete(strip(tempFilename));

// str looks like this: USERNAME=pedro

username = str[poschar("=",str) + 1];

errmsg("Computer username is %s",strip(username));

Creating a Sample Data File

visit counter for blogspot

If you want to create a simple sample data file (perhaps to test tabulations or edits instead of using the complete data file), you can create a small batch program to select cases to output. For instance, this program selects every twentieth case to generate a 5% sample:



PROC GLOBAL

numeric samplePercentage = 5;

numeric caseCount = 0;

PROC CREATESAMPLE_QUEST

preproc

inc(caseCount);

if caseCount = ( 100 / samplePercentage ) then

caseCount = 0;
else

skip case;
endif;

Alternatively, you can use the random function to generate a sample file that does not choose every nth case. Remember to call the seed function before using the random function.

if random(1,100 / samplePercentage) <> 1 then

skip case;

endif;

Randomizing the Order of Questions

In CSPro there is no simple way to change the order that questions are asked in a data entry application, but it can be done with some logic. The following code is an example of how one can use logic to randomize the order that questions are asked. The code randomizes the order in which five questions, the field names of which are listed in the fieldNames array, are asked.

PROC GLOBAL

numeric numQuestions = 5;

array questionOrder(5);

array alpha fieldNames(5) = "QUESTION1","QUESTION2","QUESTION3","QUESTION4","QUESTION5";

alpha fieldName;

function gotoQuestion(questionNumber)

fieldName = fieldNames(questionNumber);

move to fieldName;

end;

function nextQuestion()
fieldName = getsymbol();

// see where we are in the list

numeric i;
do i = 1 while fieldNames(i) <> fieldName

enddo;

// now i points to what question number we're on

// now find out where in the order it is

numeric j;
do j = 1 while questionOrder(j) <> i
enddo;
if j = numQuestions then

move to ANOTHER_QUESTION; // we are done with the rotating questions
else

gotoQuestion(questionOrder(j + 1));

endif;
end;

function startQuestions()

numeric i,j;

do i = 1 while i <= numQuestions

questionOrder(i) = random(1,numQuestions);

// see if this question has already been inserted

do j = ( i - 1 ) while j > 0 by (-1)

if questionOrder(j) = questionOrder(i) then // the new value is a repeat

j = 0; // this will terminate the inner do loop

i = i - 1; // this will force the outer do loop to repeat for this value

endif;

enddo;

enddo;
gotoQuestion(questionOrder(1));
end;

PROC CHANGEQUESTIONORDER_FF

preproc

seed(systime());

PROC CHANGEQUESTIONORDER_ID

startQuestions();

PROC QUESTION1

nextQuestion();

PROC QUESTION2

nextQuestion();

PROC QUESTION3
nextQuestion();

PROC QUESTION4
nextQuestion();

PROC QUESTION5

nextQuestion();