A better way to do this -- add/remove multiple childs
I have 6 movieClips on stage. When I roll over any one of them, I want to:
A) removeChild the remaining 5 movieClips and then
B) bring a new movieClip onto stage that would hold a description and possible button links
Upon rollOut, I want to fire a 3 second delay, removeChild the description movieClip and then addChild the original 5 (removed) movieClips.
Make sense?
I started typing away and came to the impression that I might be going about this the LONG way. Any shorter/smarter ideas would be appreciated.
Here's the code:
package{
import flash.display.*;
import flash.events.*;
public class mainAS extends MovieClip{
public var backgroundImage:imageMap2_mc = new imageMap2_mc();
public var holder1:holder_mc = new holder_mc();
public var holder2:holder_mc = new holder_mc();
public var holder3:holder_mc = new holder_mc();
public var holder4:holder_mc = new holder_mc();
public var holder5:holder_mc = new holder_mc();
public var holder6:holder_mc = new holder_mc();
public function mainAS():void{
//background image
backgroundImage.x = 0;
backgroundImage.y = 0;
addChild(backgroundImage);
// holder 1
holder1.x = 50;
holder1.y = 30;
addChild(holder1);
holder1.addEventListener(MouseEvent.ROLL_OVER, holder1Fire)
// holder 2
holder2.x = 250;
holder2.y = 30;
addChild(holder2);
holder2.addEventListener(MouseEvent.ROLL_OVER, holder2Fire)
// holder 3
holder3.x = 450;
holder3.y = 30;
addChild(holder3);
holder3.addEventListener(MouseEvent.ROLL_OVER, holder3Fire)
// holder 4
holder4.x = 50;
holder4.y = 225;
addChild(holder4);
holder4.addEventListener(MouseEvent.ROLL_OVER, holder4Fire)
// holder 5
holder5.x = 250;
holder5.y = 225;
addChild(holder5);
holder5.addEventListener(MouseEvent.ROLL_OVER, holder5Fire)
// holder 6
holder6.x = 450;
holder6.y = 225;
addChild(holder6);
holder6.addEventListener(MouseEvent.ROLL_OVER, holder6Fire)
//Fire away
private function holder1Fire(e:Event):void{
trace("holder 1");
//removeChild all remaining
//addChild description MovieClip
// description_mc.addEventListner(function to include rollOff Listener -- fire timer -- remove description + add original mc's)
private function holder2Fire(e:Event):void{
trace("holder 2");
//removeChild
private function holder3Fire(e:Event):void{
trace("holder 3");
//removeChild
private function holder4Fire(e:Event):void{
trace("holder 4");
//removeChild
private function holder5Fire(e:Event):void{
trace("holder 5");
//removeChild
private function holder6Fire(e:Event):void{
trace("holder 6");
//removeChild
If the main reason for adding and removing is so that only one is visible, then you can just use the visible property along with a reduction in code. Here's a few thoughts along those lines, though not the whole deal...
Create a function that turns all of the object visible/invisible using a loop...
function showAll(truefalse:Boolean){
for(var i=1; i<7; i++){
this["holder"+String(i)].visible = truefalse;
Then have all your object share the same rollover function....
holder1.addEventListener(MouseEvent.ROLL_OVER, clickHolder);
holder2.addEventListener(MouseEvent.ROLL_OVER, clickHolder);
holder3.addEventListener(MouseEvent.ROLL_OVER, clickHolder);
etc...
function clickHolder(evt:MouseEvent):void {
showAll(false); // hide all first
evt.currentTarget.visible = true; // show the one being hovered
// store the name of the description mc with the clip and call it...
this[evt.currentTarget.desc].visible = true;
Similar Messages
-
Better Way To Do This? Selector Operator...
I'm currently writing the selection operator for the algorithm. The aim of it is
to rate how the coursework block have been allocated and give there allocation
a rating...
How I have done it is have a method that searches through the one of the parent
timetables. It looks for coursework time blocks. Once it finds one it notes
this and looks at the next block along. If this is a coursework time block it
notes this as well. I then perform an operation comparing these two coursework
time blocks to find out if they are for the same Module. If they are not this
is not a very effective coursework timetable strategy.
Because of this I note in an array the the position of these two coursework time
block and give them a fitness rating of 1000. I then go on to see if the next
block is a coursework time block. If it is and its not of the same Module ID of
the two previous then I not these 3 block down in an array and give them a
fitness rating of 2000.
My concern is that I am using allot of if and for loop's and the code is
starting to look untidy at best. Is there any better way of doing this?
Below Is my code:
* @param parentOne
* @param parentTwo
public void selectionOperator(ArrayList parentOne, ArrayList parentTwo){
// Store's the fitness rating of sections of the timetable...
ArrayList parentOneBlockFitnessRating = new ArrayList ();
ArrayList parentTwoBlockFitnessRating = new ArrayList ();
//Loops through the timetable's timeblocks...
for (int i = 0; i < parentOne.size(); i++) {
//Checks to see if the current time block is of the class: CourseworkTimeBlock,
//if so it enters this statement...
if(parentOne.get(i).getClass().toString().equals("class Timetable.CourseworkTimeBlock")){
//A temp store for the current CourseworkTimeBlock...
CourseworkTimeBlock tempBlockOne = (CourseworkTimeBlock) parentOne.get(i);
System.out.println("Got Here!, Module ID...: " + tempBlockOne.getModuleId());
//Checks to see if the next time block along is of the class: CourseworkTimeBlock,
//if so it enters this statement...
if(parentOne.get(i+1).getClass().toString().equals("class Timetable.CourseworkTimeBlock")){
//A temp store for the next CourseworkTimeBlock...
CourseworkTimeBlock tempBlockTwo = (CourseworkTimeBlock) parentOne.get(i+1);
System.out.println("Got Here Aswell!");
//Checks to see if the current and next CourseworkTimeBlock module Id's
//are the same, if there arn't then this section is entered...
if(!tempBlockOne.getModuleId().equals(tempBlockTwo.getModuleId())){
//Checks to see if the second time block along is of the class: CourseworkTimeBlock,
//if so it enters this statement...
if(parentTwo.get(i+2).getClass().toString().equals("class Timetable.CourseworkTimeBlock")){
//A temp store for the second CourseworkTimeBlock along...
CourseworkTimeBlock tempBlockThree = (CourseworkTimeBlock) parentTwo.get(i+2);
//Checks to see if all 3 of the Module Id's of the CourseworkTimeBlocks match,
//if they don't match this statement is entered...
if(! tempBlockOne.getModuleId().equals(tempBlockTwo.getModuleId()) && (tempBlockTwo.getModuleId().equals(tempBlockThree.getModuleId()))) {
//ArrayList to store the fitness rating of the current block
//selection...
ArrayList <Integer> blockFitness = new ArrayList<Integer>();
//Position of first block.
blockFitness.add(i);
//Position of second block.
blockFitness.add(i+1);
//Position of second block.
blockFitness.add(i+2);
//Fitness Value
blockFitness.add(2000);
//Add block rating to main rating ArrayList...
parentOneBlockFitnessRating.add(blockFitness);
else{
//ArrayList to store the fitness rating of the current block
//selection...
ArrayList <Integer> blockFitness = new ArrayList<Integer>();
//Position of first block.
blockFitness.add(i);
//Position of second block.
blockFitness.add(i+1);
//Fitness Value
blockFitness.add(1000);
//Add block rating to main rating ArrayList...
parentOneBlockFitnessRating.add(blockFitness);
for (int o = 0; o < parentTwo.size(); o++) {
if(parentTwo.get(o).getClass().toString().equals("class Timetable.CourseworkTimeBlock")){
CourseworkTimeBlock tempBlockOne = (CourseworkTimeBlock) parentTwo.get(o);
System.out.println("Got Here!, Module ID...: " + tempBlockOne.getModuleId());
if(parentTwo.get(o+1).getClass().toString().equals("class Timetable.CourseworkTimeBlock")){
CourseworkTimeBlock tempBlockTwo = (CourseworkTimeBlock) parentTwo.get(o+1);
System.out.println("Got Here Aswell!");
if(!tempBlockOne.getModuleId().equals(tempBlockTwo.getModuleId())){
if(parentTwo.get(o+2).getClass().toString().equals("class Timetable.CourseworkTimeBlock")){
CourseworkTimeBlock tempBlockThree = (CourseworkTimeBlock) parentTwo.get(o+2);
if(! tempBlockOne.getModuleId().equals(tempBlockTwo.getModuleId()) && (tempBlockTwo.getModuleId().equals(tempBlockThree.getModuleId()))) {
ArrayList <Integer> blockFitness = new ArrayList<Integer>();
//Position of first block.
blockFitness.add(o);
//Position of second block.
blockFitness.add(o+1);
//Position of second block.
blockFitness.add(o+2);
//Fitness Value
blockFitness.add(2000);
//Add block rating to main rating ArrayList...
parentTwoBlockFitnessRating.add(blockFitness);
else{
ArrayList <Integer> blockFitness = new ArrayList<Integer>();
//Position of first block.
blockFitness.add(o);
//Position of second block.
blockFitness.add(o+1);
//Fitness Value
blockFitness.add(1000);
//Add block rating to main rating ArrayList...
parentTwoBlockFitnessRating.add(blockFitness);
}As you can see there are allot if statements and some bad coding practice to boot. But I don't know what other ways to do it....
Any directions of other ways how to do this?
Many Thanks
ChrisUnfortunately, I think you're stuck with a bunch of if-statements.
Fortunately, I have some things that may help you.
First, I usually make sure something is of x class via this
if (someObject instanceof SomeClass) {So, I'd adjust your 'class checking' conditionals from this
if(parentOne.get(i).getClass().toString().equals("class Timetable.CourseworkTimeBlock"))to this
if (parentOne.get(i) instanceof Timetable.CourseworkTimeBlock) {Secondly, your code logic is kind of confusing.
Why do you have a for-loop that iterates through every CourseworkTimeBlock, if you then (within each possible iteration) check iteration+1 and iteration+2? What happens if those throw an ArrayIndexOutOfBoundsException, or are null? -
I am having trouble transferring files from an old MacBook (2007) to a MacBook Air over a wireless network. The connection was interrupted and the time was over 24 hours. Is there a better way to do this? I'm using Migration assistant. The lack of an ethernet port on MacBook air does not help.
William ..
Alternative data transfer methods suggested here > OS X: How to migrate data from another Mac using Mavericks -
There's got to be a better way to do this (RAM preview frustration)
I loaded a 1:20 second Full HD clip into after effects. I need to edit the video based on certain sounds in the video and see if I'm matching them up correctly by previewing it with sound.
The problem is i'm getting frustrated due to After effects not behaving like Premiere. First who thought it was a good idea not to incorporate sound into after effects? Second, I have an i7 sandy bridge processor, and 16 gbs of ram, yet it still takes time to render the ram preview (with no effects on it yet).
So ram preview is my only option for sound, but the problem is every time I hit ram preview it starts the video all the way from the beginning. This is frustrating as I want to start at a specific point. Imagine having a longer video where the editing needs to take place at the end.
There are people out there doing a lot more complicated professional projects, what do you guys do to get around this?
Why can't after effects do some basic things like premiere like render fast with sound? Is it due to Mercury engine and 64 bits?
This is one of the best products on the market, surely there is a better way to do this right?but the problem is every time I hit ram preview it starts the video all the way from the beginning.
Window --> Preview, enable the "From current time" option
yet it still takes time to render the ram preview (with no effects on it yet).
There is no magic button. If it is compressed, naturally it needs to be decompressed and decoded first. This can consume resources even on fast machines. Furthermore, drive speed matters a lot in such cases. This might actualyl multiply, if you use multiprocessing, so for this kind of simple setup it's usually better to not use it. If your harddrives are fragmented or simply generally slow, frames cannot be loaded as fast and neither will AE be able to use the disk cache. Ergo, convert the footage and move it to the fastest drive in your system.
what do you guys do to get around this?
We preview at reduced compo resolution to extend RAM previews and place markers while the RAM preview plays using the * key on the numpad.
Mylenium -
Better Way to do this loop.
I know there is better ways to do this so that I can merely have it loop infinitely until it hits the max password. I would also like to keep the spot where it has the print Statements because I tend to set some other code in front of it.
If anyone also has some Ideas so I can have it stop and start in particular positions.
Like lets say ?!!!!? to ?~~~~?
Thanks a ton. Below is the code.
char[] password = new char[20];
int current_last_letter = 0;
int max_password = 3;
while(current_last_letter < max_password)
for(int counter_gamma = 32; counter_gamma <= 126; counter_gamma++)
for(int counter_beta = 32; counter_beta <= 126; counter_beta++)
for(int counter_alpha = 32; counter_alpha <= 126; counter_alpha++) //alpha = increase last character by one
password[current_last_letter] = (char)counter_alpha;
System.out.print(password);
System.out.println("::null");
if(current_last_letter > 0)
password[current_last_letter-1] = (char)counter_beta;
else
counter_beta = 127;
if(current_last_letter > 1)
password[current_last_letter-2] = (char)counter_gamma;
else
counter_gamma = 127;
current_last_letter++;
If I interpreted your code right, you simply want to count in radix '~'-' '+1 (read this carefully).
Given a password, and a lo/hi value for the character range, the following method returns the
lexicographically next password. The method returns null if no such password exists -- char[] nextPassword(char[] pw, char lo, char hi) {
for (int i= pw.lenght; --i >= 0;)
if (pw[i] < hi) { // next character possible here?
pw[i]++;
return pw;
else // * no, reset to first value and continue;
pw= lo;
return null; // all pw-chars reached their hi value
So, if you initialize a password char array as follows -- char[] pw= new char[20];
Arrays.fill(pw, ' '); the following fragment handles every possible password -- do {
handlePassword(pw); // do something with pw
pw= nextPassword(pw, ' ', '~');
} while (pw != null); kind regards,
Jos -
When selecting into a variable, is there a better way to do this? I want to make sure I don't get an error if there are no rows found. I think it's inefficient to count the number of occurrences before selecting into the variable. Can I use %NOROWSFOUND or something similar? If so, can you please provide an example? Thanks, Margaret
Tzi := null;
SELECT count(BUSINESS_tz)
INTO Tzi_cnt
FROM BUSINESS O
WHERE ID = Fac_id AND BUSINESS_type = 'Store' AND O.Business_seq = (SELECT Business_seq
FROM Org_lookup
WHERE Store_seq = 0);
IF Tzi_cnt > 0
THEN
SELECT BUSINESS_tz
INTO Tzi
FROM BUSINESS O
WHERE ID = Fac_id AND BUSINESS_type = 'Store' AND O.Business_seq = (SELECT Business_seqthe proper way to do this is to use an exception block;
so
begin
Tzi := null;
SELECT BUSINESS_tz
INTO Tzi_cnt
FROM BUSINESS O
WHERE ID = Fac_id AND BUSINESS_type = 'Store' AND O.Business_seq = (SELECT Business_seq
FROM Org_lookup
WHERE Store_seq = 0);
exception
when no_data_found
then
null; -- put any code to execute here or raise exception
end;you can also use sql%rowcount to find out how many rows your sql statement affected:
eg directly after your sql and before any rollback or commit
declare
v_rowcount number;
begin
insert into <table_name>
select * from <other_table>;
v_rowcount := sql%rowcount;
end; -
How to create a function with dynamic sql or any better way to achieve this?
Hello,
I have created below SQL query which works fine however when scalar function created ,it
throws an error "Only functions and extended stored procedures can be executed from within a
function.". In below code First cursor reads all client database names and second cursor
reads client locations.
DECLARE @clientLocation nvarchar(100),@locationClientPath nvarchar(Max);
DECLARE @ItemID int;
SET @locationClientPath = char(0);
SET @ItemID = 67480;
--building dynamic sql to replace database name at runtime
DECLARE @strSQL nvarchar(Max);
DECLARE @DatabaseName nvarchar(100);
DECLARE @localClientPath nvarchar(MAX) ;
Declare databaselist_cursor Cursor for select [DBName] from [DataBase].[dbo].
[tblOrganization]
OPEN databaselist_cursor
FETCH NEXT FROM databaselist_cursor INTO @DatabaseName
WHILE @@FETCH_STATUS = 0
BEGIN
PRINT 'Processing DATABASE: ' + @DatabaseName;
SET @strSQL = 'DECLARE organizationlist_cursor CURSOR
FOR SELECT '+ @DatabaseName +'.[dbo].[usGetLocationPathByRID]
([LocationRID])
FROM '+ @DatabaseName +'.[dbo].[tblItemLocationDetailOrg] where
ItemId = '+ cast(@ItemID as nvarchar(20)) ;
EXEC sp_executesql @strSQL;
-- Open the cursor
OPEN organizationlist_cursor
SET @localClientPath = '';
-- go through each Location path and return the
FETCH NEXT FROM organizationlist_cursor into @clientLocation
WHILE @@FETCH_STATUS = 0
BEGIN
SELECT @localClientPath = @clientLocation;
SELECT @locationClientPath =
@locationClientPath + @clientLocation + ','
FETCH NEXT FROM organizationlist_cursor INTO
@clientLocation
END
PRINT 'current databse client location'+ @localClientPath;
-- Close the Cursor
CLOSE organizationlist_cursor;
DEALLOCATE organizationlist_cursor;
FETCH NEXT FROM databaselist_cursor INTO @DatabaseName
END
CLOSE databaselist_cursor;
DEALLOCATE databaselist_cursor;
-- Trim the last comma from the string
SELECT @locationClientPath = SUBSTRING(@locationClientPath,1,LEN(@locationClientPath)- 1);
PRINT @locationClientPath;
I would like to create above query in function so that return value would be used in
another query select statement and I am using SQL 2005.
I would like to know if there is a way to make this work as a function or any better way
to achieve this?
Thanks,This very simple: We cannot use dynamic SQL from used-defined functions written in T-SQL. This is because you are not permitted do anything in a UDF that could change the database state (as the UDF may be invoked as part of a query). Since you can
do anything from dynamic SQL, including updates, it is obvious why dynamic SQL is not permitted as per the microsoft..
In SQL 2005 and later, we could implement your function as a CLR function. Recall that all data access from the CLR is dynamic SQL. (here you are safe-guarded, so that if you perform an update operation from your function, you will get caught.) A word of warning
though: data access from scalar UDFs can often give performance problems and its not recommended too..
Raju Rasagounder Sr MSSQL DBA
Hi Raju,
Can you help me writing CLR for my above function? I am newbie to SQL CLR programming.
Thanks in advance!
Satya
-
Is there better way to do this? (Xml Pretty Print | node removing)
Hi all, I have been working at home on a small project to help my Java Jedi training. :-)
My app saves quotes from authors in an xml file.
I have a class [XmlRepository extends Thread] that holds control of an xml file to handle requests for Nodes.
When I remove a node I get a Line Space above the node that was removed, or better put my node gets replaced by a empty line.
Pretty print or correct Node removing.
part of my xml is like this (I have resumed it for readability):
<entities forUser="ffffffff-ffff-ffff-ffff-ffffffffffff">
<quotes/>
<authors>
<author id="f156c570-c676-4d69-9b15-ae7d859ff771" languageCode="en" regenerateAs="com.fdt.cognoscere.entities.sources.Author">
<lastNames>Poe</lastNames>
<firstNames>Edgar Allan</firstNames>
</author>
<author id="35dc0c5a-3813-4a10-af49-8d4ea1c2cee0" languageCode="en" regenerateAs="com.fdt.cognoscere.entities.sources.Author">
<lastNames>Wilde</lastNames>
<firstNames>Oscar</firstNames>
</author>
<author id="317f72ea-add6-4bd2-8c63-d8b373a830ab" languageCode="en" regenerateAs="com.fdt.cognoscere.entities.sources.Author">
<lastNames>Christie</lastNames>
<firstNames>Agatha</firstNames>
</author>
<author id="28047c89-b647-4c40-b6c7-677feaf2dfda" languageCode="en" regenerateAs="com.fdt.cognoscere.entities.sources.Author">
<lastNames>Shakespeare</lastNames>
<firstNames>William</firstNames>
</author>
</authors>
</entities>If I remove A Node ( Edgar Allan Poe (1st in this case)) the resulting Xml when saved is like this (I have added the space indentation just as it is outputted by my code):
<entities forUser="ffffffff-ffff-ffff-ffff-ffffffffffff">
<quotes/>
<author id="35dc0c5a-3813-4a10-af49-8d4ea1c2cee0" languageCode="en" regenerateAs="com.fdt.cognoscere.entities.sources.Author">
<lastNames>Wilde</lastNames>
<firstNames>Oscar</firstNames>
</author>
<author id="317f72ea-add6-4bd2-8c63-d8b373a830ab" languageCode="en" regenerateAs="com.fdt.cognoscere.entities.sources.Author">
<lastNames>Christie</lastNames>
<firstNames>Agatha</firstNames>
</author>
<author id="28047c89-b647-4c40-b6c7-677feaf2dfda" languageCode="en" regenerateAs="com.fdt.cognoscere.entities.sources.Author">
<lastNames>Shakespeare</lastNames>
<firstNames>William</firstNames>
</author>
</authors>
</entities>this is how I initialize the XML DOM Handlers, and the method for removing a Node:
* Initializes factory instances and member variables.
private void initialize() {
//obtain an instance of a documentFactory create a document documentBuilder
this.documentFactory = DocumentBuilderFactory.newInstance();
//Configure the documentFactory to be name-space aware and validate trough an xsd file
this.documentFactory.setNamespaceAware(true);
this.documentFactory.setValidating(true);
this.documentFactory.setAttribute(JAXP_SCHEMA_LANGUAGE, W3C_XML_SCHEMA);
try {
//obtain an instance of an XPathFactory
this.xpathFactory = XPathFactory.newInstance(XPathFactory.DEFAULT_OBJECT_MODEL_URI);
//obtain an instance of the xpath evaluator object
this.xpathEvaluator = this.xpathFactory.newXPath();
//set namespace mapping configurations
NamespaceContextMap namespaceMappings = new NamespaceContextMap();
namespaceMappings.put("xml", "http://www.w3.org/XML/1998/namespace");
namespaceMappings.put("xmlns", "http://www.w3.org/2000/xmlns/");
namespaceMappings.put("xsd", "http://www.w3.org/2001/XMLSchema");
namespaceMappings.put("xsi", "http://www.w3.org/2001/XMLSchema-instance");
namespaceMappings.put(this.schemaNamespaceMapping, this.schemaNamespace);
//add mappings
this.xpathEvaluator.setNamespaceContext(namespaceMappings);
} catch (XPathFactoryConfigurationException ex) {
Logger.getLogger(XmlRepository.class.getName()).log(Level.SEVERE, null, ex);
try {
//obtain a trasformer factory to save the file
this.transformerFactory = TransformerFactory.newInstance();
this.transformerFactory.setAttribute("indent-number", 4);
//obtain the transforme
this.transformer = this.transformerFactory.newTransformer();
//setup transformer
this.transformer.setOutputProperty(OutputKeys.METHOD, "xml");
this.transformer.setOutputProperty(OutputKeys.INDENT, "yes");
this.transformer.setOutputProperty(OutputKeys.MEDIA_TYPE, "text");
this.transformer.setOutputProperty("{http://xml.apache.org/xslt}indent-amount", "4");
} catch (TransformerConfigurationException tcex) {
Logger.getLogger(XmlRepository.class.getName()).log(Level.SEVERE, null, tcex);
* Removes a node by evaluating the XPATH expression.
* @param xpath A String instance with the XPATH expression representing the element to remove.
* @throws com.fdt.cognoscere.storage.exceptions.UnableToRemoveException When an exception occurs that prevents the repository to execute the remove statement.
public void removeNode(final String xpath) throws UnableToRemoveException {
Node nodeToRemove = null;
Node parentNode = null;
//verify xpath
if (xpath == null)
throw new IllegalArgumentException("The xpath argument cannot be null.");
//verify that the repository is loaded
if (!this.loaded)
throw new IllegalStateException("The XmlRepository faild to load properly and it is in an invalid state. It cannot perfom any operation.");
try {
//get the node to remove out of the xpath expression
nodeToRemove = this.getNode(xpath);
//throw an exception if no node was found to remove
if (nodeToRemove == null)
throw new UnableToFindException("The node element trying to be remove does not exist.");
//obtain the parent node to remove its child
parentNode = nodeToRemove.getParentNode();
//remove the node from the parent node
nodeToRemove = parentNode.removeChild(nodeToRemove);
} catch.......removed to save space{
} finally {
//normalize document
this.document.normalize();
}Please tell me if I could do this better,
thanks,
f(t)franciscodiaztrepat wrote:
When I remove a node I get a Line Space above the node that was removed, or better put my node gets replaced by a empty line.Replaced? No, there's already a new-line character after the node that was removed. And there was one before that node too. You didn't remove either of those, so after the removal there are two consecutive new-line characters. As you can see.
And no, trying to pretty-print the XML document won't remove any of those. It might add whitespace to make the document nicely indented, but it won't ever remove whitespace. If you want whitespace removed then you'll have to do it yourself.
For example, after you remove a node, also remove the node following it if it's a whitespace text node. Or something like that. -
Is there a better way to do this projection/aggregate query?
Hi,
Summary:
Can anyone offer advice on how best to use JDO to perform
projection/aggregate queries? Is there a better way of doing what is
described below?
Details:
The web application I'm developing includes a GUI for ad-hoc reports on
JDO's. Unlike 3rd party tools that go straight to the database we can
implement business rules that restrict access to objects (by adding extra
predicates) and provide extra calculated fields (by adding extra get methods
to our JDO's - no expression language yet). We're pleased with the results
so far.
Now I want to make it produce reports with aggregates and projections
without instantiating JDO instances. Here is an example of the sort of thing
I want it to be capable of doing:
Each asset has one associated t.description and zero or one associated
d.description.
For every distinct combination of t.description and d.description (skip
those for which there are no assets)
calculate some aggregates over all the assets with these values.
and here it is in SQL:
select t.description type, d.description description, count(*) count,
sum(a.purch_price) sumPurchPrice
from assets a
left outer join asset_descriptions d
on a.adesc_no = d.adesc_no,
asset_types t
where a.atype_no = t.atype_no
group by t.description, d.description
order by t.description, d.description
it takes <100ms to produce 5300 rows from 83000 assets.
The nearest I have managed with JDO is (pseodo code):
perform projection query to get t.description, d.description for every asset
loop on results
if this is first time we've had this combination of t.description,
d.description
perform aggregate query to get aggregates for this combination
The java code is below. It takes about 16000ms (with debug/trace logging
off, c.f. 100ms for SQL).
If the inner query is commented out it takes about 1600ms (so the inner
query is responsible for 9/10ths of the elapsed time).
Timings exclude startup overheads like PersistenceManagerFactory creation
and checking the meta data against the database (by looping 5 times and
averaging only the last 4) but include PersistenceManager creation (which
happens inside the loop).
It would be too big a job for us to directly generate SQL from our generic
ad-hoc report GUI, so that is not really an option.
KodoQuery q1 = (KodoQuery) pm.newQuery(Asset.class);
q1.setResult(
"assetType.description, assetDescription.description");
q1.setOrdering(
"assetType.description ascending,
assetDescription.description ascending");
KodoQuery q2 = (KodoQuery) pm.newQuery(Asset.class);
q2.setResult("count(purchPrice), sum(purchPrice)");
q2.declareParameters(
"String myAssetType, String myAssetDescription");
q2.setFilter(
"assetType.description == myAssetType &&
assetDescription.description == myAssetDescription");
q2.compile();
Collection results = (Collection) q1.execute();
Set distinct = new HashSet();
for (Iterator i = results.iterator(); i.hasNext();) {
Object[] cols = (Object[]) i.next();
String assetType = (String) cols[0];
String assetDescription = (String) cols[1];
String type_description =
assetDescription != null
? assetType + "~" + assetDescription
: assetType;
if (distinct.add(type_description)) {
Object[] cols2 =
(Object[]) q2.execute(assetType,
assetDescription);
// System.out.println(
// "type "
// + assetType
// + ", description "
// + assetDescription
// + ", count "
// + cols2[0]
// + ", sum "
// + cols2[1]);
q2.closeAll();
q1.closeAll();Neil,
It sounds like the problem that you're running into is that Kodo doesn't
yet support the JDO2 grouping constructs, so you're doing your own
grouping in the Java code. Is that accurate?
We do plan on adding direct grouping support to our aggregate/projection
capabilities in the near future, but as you've noticed, those
capabilities are not there yet.
-Patrick
Neil Bacon wrote:
Hi,
Summary:
Can anyone offer advice on how best to use JDO to perform
projection/aggregate queries? Is there a better way of doing what is
described below?
Details:
The web application I'm developing includes a GUI for ad-hoc reports on
JDO's. Unlike 3rd party tools that go straight to the database we can
implement business rules that restrict access to objects (by adding extra
predicates) and provide extra calculated fields (by adding extra get methods
to our JDO's - no expression language yet). We're pleased with the results
so far.
Now I want to make it produce reports with aggregates and projections
without instantiating JDO instances. Here is an example of the sort of thing
I want it to be capable of doing:
Each asset has one associated t.description and zero or one associated
d.description.
For every distinct combination of t.description and d.description (skip
those for which there are no assets)
calculate some aggregates over all the assets with these values.
and here it is in SQL:
select t.description type, d.description description, count(*) count,
sum(a.purch_price) sumPurchPrice
from assets a
left outer join asset_descriptions d
on a.adesc_no = d.adesc_no,
asset_types t
where a.atype_no = t.atype_no
group by t.description, d.description
order by t.description, d.description
it takes <100ms to produce 5300 rows from 83000 assets.
The nearest I have managed with JDO is (pseodo code):
perform projection query to get t.description, d.description for every asset
loop on results
if this is first time we've had this combination of t.description,
d.description
perform aggregate query to get aggregates for this combination
The java code is below. It takes about 16000ms (with debug/trace logging
off, c.f. 100ms for SQL).
If the inner query is commented out it takes about 1600ms (so the inner
query is responsible for 9/10ths of the elapsed time).
Timings exclude startup overheads like PersistenceManagerFactory creation
and checking the meta data against the database (by looping 5 times and
averaging only the last 4) but include PersistenceManager creation (which
happens inside the loop).
It would be too big a job for us to directly generate SQL from our generic
ad-hoc report GUI, so that is not really an option.
KodoQuery q1 = (KodoQuery) pm.newQuery(Asset.class);
q1.setResult(
"assetType.description, assetDescription.description");
q1.setOrdering(
"assetType.description ascending,
assetDescription.description ascending");
KodoQuery q2 = (KodoQuery) pm.newQuery(Asset.class);
q2.setResult("count(purchPrice), sum(purchPrice)");
q2.declareParameters(
"String myAssetType, String myAssetDescription");
q2.setFilter(
"assetType.description == myAssetType &&
assetDescription.description == myAssetDescription");
q2.compile();
Collection results = (Collection) q1.execute();
Set distinct = new HashSet();
for (Iterator i = results.iterator(); i.hasNext();) {
Object[] cols = (Object[]) i.next();
String assetType = (String) cols[0];
String assetDescription = (String) cols[1];
String type_description =
assetDescription != null
? assetType + "~" + assetDescription
: assetType;
if (distinct.add(type_description)) {
Object[] cols2 =
(Object[]) q2.execute(assetType,
assetDescription);
// System.out.println(
// "type "
// + assetType
// + ", description "
// + assetDescription
// + ", count "
// + cols2[0]
// + ", sum "
// + cols2[1]);
q2.closeAll();
q1.closeAll(); -
A better way to do this ?
where does the sql stuff excute in the following stored procedure, directly in the database or it goes through the oracle VM first ?
CREATE OR REPLACE AND RESOLVE JAVA SOURCE NAMED "CustomExport" AS
import javax.sql.Connection;
import oracle.jdbc.OracleDriver;
import java.sql.DriverManager;
import java.sql.SQLException;
public class CustomExport
public void do() throws SQLException{
OracleDriver oracle = new OracleDriver();
DriverManager.registerDriver(oracle);
Connection conn = oracle.defaultConnection();
PreparedStatement st = conn.prepareStatement("select from table where col=?");
st.setString(1,"value");
ResultSet rs = st.execute();
and is there a better way to read and parse an xml document with PL/SQL.what i've read about is the ability to parse an XML file to load its data directly into a database table.What i was looking for was just a way to parse XML without having to load any data into tables so i did it with java.
CREATE OR REPLACE AND RESOLVE JAVA SOURCE NAMED "CustomParser" AS
import javax.xml.prasers.SAXParser;
import javax.xml.parsers.SAXParserFactory;
import org.xml.sax.Attributes;
import org.xml.sax.InputSource;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;
public class CustomParser
private static CustomParseHandler handler = new CustomParseHandler();
public static void parseXMLFile(String fileName) throws FileNotFoundException,IOException,SAXException
SAXParserFactory saxFactory = SAXParserFactory.newInstance();
SAXParser parser=saxFactory.newSAXParser();
parser.parse(new FileInputStream(fileName)),handler);
private class CustomParseHandler extends DefaultHandler{
StringBuffer buff;
public CustomParseHandler()
this.buff = new StringBuffer();
public void startElement (String uri, String localName,
String qName, Attributes attributes)
throws SAXException
buff.append("<").append(qName).append(">");
public void endElement (String uri, String localName, String qName)
throws SAXException
buff.append("</").append(qName).append(">").append(newLine);
public void characters (char ch[], int start, int length)
throws SAXException
String fieldName = new String(ch,start,length);
if(fieldName==null || "".equals(fieldName.trim()))
return;
public void clearBuffer(){
buff.delete(0, buff.length());
public String getXMLString(){
return buff.toString();
}PLSQL does not go through Java to access the database. The actual access to the database is via the same mechanism for both, so in some sense, both perform about the same. However, PLSQL datatypes have the same representation as database datatypes so there is no conversion. Java datatypes have different representations than database datatypes so there is a conversion cost associated with moving data between Java and the database.
If your processing is simple and you are moving a lot of data, PLSQL is likely the better choice. If your processing is more complex and you are moving less data, Java is likely the better choice. There are other things such as portability you should consider, but the amount of data and complexity of the code are the first considerations.
Douglas -
Looking for a better way to write this SQL
Oracle version 11R2
OS version (does not matter)
What I trying to do is write a query that finds Public Synonyms without a target object. I came up with this but I thinking there's a better way.
Select
s.owner, s.synonym_name, s.table_name, s.table_owner, s.db_link, InitCap(o.object_type) object_type
from
sys.DBA_SYNONYMS s, sys.DBA_OBJECTS o
where
s.synonym_name is not null
and
s.table_owner = o.owner (+)
and
s.table_name = o.object_name (+)
and
s.owner = 'PUBLIC'
and
object_type is null; object_type is null appears to be the weakness. It seems the check of the target object should be better.
Feedback, comments, queries welcome.I'm not sure exactly what "better" means in this context (faster, easier to read, etc.) but I'd tend to use a NOT EXISTS
SELECT s.*
FROM dba_synonyms s
WHERE owner = 'PUBLIC'
AND s.db_link IS NULL
AND NOT EXISTS (
SELECT 1
FROM dba_objects o
WHERE o.owner = s.table_owner
AND o.object_name = s.table_name )I added the DB_LINK criteria to filter out public synonyms that reference objects in remote databases which obviously don't exist in the local DBA_OBJECTS.
Justin -
Callouts and anchored objects - there must be a better way to do this
I've spent a lot of time in the last six months rebuilding PDF files in InDesign. It's part of my ordinary responsibilities, but I'm doing a lot more of it for some reason. Because I'm sending the text of these rebuild documents out for translation, I like to keep all of the text in a single story. It really helps to have the text in "logical order," I think; when I'm prepping a trifold brochure, I try pretty hard to make sure that the order in which the readers will read the text is duplicated in the flow of the story throughout the ID document.
So, I'm rebuilding a manual that has a 3-column format on lettersize paper, and it's full of callouts. Chock full of 'em. They're not pull quotes, either; each of these things has unique text. Keeping in mind that I'd like the text in these callouts to remain in the same position in the text once I've linked all the stories and exported an RTF for translation, what's the best way to handle them? What I've been doing is inserting an emptly stroked frame as an anchored object, sized and positioned to sit above the text that is supposed to be called out. When my translations come back, they're always longer than the source document, so as I crawl through the text, I resize the anchored frames to match the size and position of the newly expanded translated text, and then nudge them into place with the keyboard.
There Has To Be a Better Way.
There is a better way, right? I'm not actually too sure. If I want to actually fill those anchored frames with text, I can't thread them into the story. I suppose that I could just thread the callout frames and assign two RTFs for translation instead of one, but then the "logical order" of my text is thrown out the window. So, I'm down to asking myself "what's more important? reduction of formatting time or maintenance of the flow of the story?" If there's something I'm missing that would let me dodge this decision, I'd love to hear about it. The only thing I can think of would work like this:
1) Duplicate callout text in the story with a custom swatch "Invisible"
2) Create "CalloutText" parastyle with "Invisible" swatch and apply it to callout text
3) Insert anchor for anchored frame immediately before the CalloutText content
4) Send it out for translation
5) While I'm waiting for it to come back, write a script that would (dunno if this is possible):
a) Step through the main story looking for any instance of CalloutText
b) Copy one continguous instance of that style to the clipboard
c) Look back in the story for the first anchor preceeding the instance of CalloutText
d) Fill the anchored object with the text from the clipboard (this is where I'm really clueless)
e) Apply a new parastyle to the text in the callout
f) Continue stepping through the story looking for further instances of CalloutText
If this really is the only decent solution, I'll just head over to the Scripting forum for some help with d). Can any of you make other suggestions?In-Tools.com wrote:
The use of Side Heads saves weeks of manual labor.
Yup, Harbs, that is exactly what I was describing. If I use the Side Heads plugin to set up a job, will my clients get a missing plug-in warning when they open up the INDD? Will roundtripping through INX strip the plugin but leave the text in the callout? (My clients don't care if the logical flow of the story is broken; it's just me.)
I'm just curious; seems like a pretty obvious purchase to me. I'll probably try to script a solution anyways, after I buy the plugin; that way I get to learn about handling anchored objects in scripts AND deliver the job on time! -
Is there a better way to do this function?
Hi,
I was just wondering if someone can suggest a better way of doing the function I have attached below. Basically, it is counting pulses (falling edges) over a 250ms time period and converting that to speed. There seems to be some cases where it counts lesser pulses for a longer period than 250ms which results in lower speeds, but physically the device doesnt run any slower. Or sometimes speed is higher. This code was written by someone else and I am trying to work it better.
V
P.S. There is an overall master While loop.
I may not be perfect, but I'm all I got!
Attachments:
counter_wait.JPG 87 KBVeeJay wrote:
@ yamaeda what do you mean by coercion dots? Can you explain in simpler terms.? Thanks!
V
coercion dots are those red dots on your arithmatic functions. That means you are dividing data of different types. For instance I32 and U8 would give you a coercion dot. What you will want to do is right click your constants, choose representation->[data type]. Either that, or you can go to the numeric-> conversion pallette (i think) thats where it is and convert numbers using the primitives there.
CLA, LabVIEW Versions 2010-2013 -
Is there a better way to do this with Flash?
I am new to Flash but am slowly teaching myself via Lynda.com etc
I have an image that I have added to a website via a content management system and want to make certain areas of that image into links to other sites.
I found this page that does the kind of thing I want to do, but it appears from looking at the source code that the person who has done this has cut the image up into several sections in order to fit it into a table: http://www3.imperial.ac.uk/staffdevelopment/postdocs1/guidance
Is there a better way to achieve the same kind of effect using Flash by making ares of an image into links and keeping the image as a whole?There are ways to keep the image whole and have portions of it linking to different places both in HTML and in Flash. In HTML you can use an image map. In Flash, you can just lay invisible buttons atop the image and use those to link.
-
Is there a better way to do this? CSS rules/Background image/tables
Hi,
I am designing a site and I have used a table for the banner. Everytime a different page is displayed, the banner image changes. I have created .html pages, and I have created a lot of css rules to change the background image. I think there must be a more efficiant way to do this?
http://www.taffyproductions.com/test/
ALSO... I need to figure out how to make the links (hover/active states) work on all the pages... I figured it out on the index page, but I'm sure there is a better css rule?Put a div in the head section? Surely you jest!
But you do hint at the easy solution - just have an embedded stylesheet in the head of each page that changed the background image only on that page. No need for any other complexities.
In other words on page1, change this -
<link href="outpost.css" rel="stylesheet" type="text/css" />
</head>
to this -
<link href="outpost.css" rel="stylesheet" type="text/css" />
<style type="text/css">
table#banner { background-image:url(images/banner1.jpg); }
</style>
</head>
and on page2 change it to this -
<link href="outpost.css" rel="stylesheet" type="text/css" />
<style type="text/css">
table#banner { background-image:url(images/banner2.jpg); }
</style>
</head>
etc.
Maybe you are looking for
-
Can you set up multiple phones on 1 account
trying to add 4 iphones to 1 apple account. Is it possible?
-
Hi, Really stumped (not saying much ). I cannot get itunes to open - when I try I get a box stating 'itunes has encountered a problem and needs to close . . .' with the following details cited in the report to microsoft: Error signature AppName: itun
-
11.1.0.7 patch kit DBUA goes slow at 33% and runs for 21 hours +
Trying to upgrade 11.1.0.6 Windows Server 2003 32-bit install to 11.1.0.7 and finding that while the installer completes OK, when I get to running the DBUA part of the upgrade (interactively), it runs fine to about 33% (execrm.sql it would seem from
-
Do we have BED,CESS & ECESS Values in Export Invoice
Hi Experts Since the conditions maintained of BED,CESS and ECESS are statistical in case of export pricing procedure. Do we have the values displayed of BED,CESS & ECESS when we create export invoice. If yes, please let me know what can be the reason
-
Tried to download 4 movies to IPad 2. After 1 taking 1 1/2 hrs received download message on 1st one. Said to retry and is 2 hrs later and still downloading. Others show waiting... I want to cancel the whole deal as something is wrong. On MacBook