Create a formula {@concat}:
whilereadingrecords;
numbervar cnt;
stringvar x;
if instr(x,{table.loc}) = 0 then
(
cnt := cnt + 1;
x := {table.loc};
);
totext(cnt,0,"") + " "+x
...where {table.loc} is your location field. Use {@concat} as your column instead of your current column in the crosstab, and while it is selected, go to group options->options tab->customize group name->use a field: {table.loc}.
Then in preview mode, select the inner cells of the crosstab->right click->format field->border->color->background->x+2 and enter:
if remainder(val(left(gridrowcolumnvalue("@concat"),2)),2) = 0 then crGray else crNoColor
On the second issue, two things. First you will not get a repeated value in the first column because it is not unique, but if you make the A,B,C row the row #1, and make dbtype row #2, you should get repeated values. Or alternatively, add the ABC row field first, then the dbtype, then the ABC row field again, and just suppress the first row in the display.
The display wiht repeated column names can be achieved by putting the crosstab in a group section based on dbtype instead of in a report header or footer. If you cannot do this because you are already using these sections, you could insert a subreport to contain the crosstab, where you insert a group on dbtype and place the crosstab there. You will still need to do the above to get the repeated rows names though.
-LB